package crazypants.enderio.conduit.item.filter;
import crazypants.enderio.conduit.gui.GuiExternalConnection;
import crazypants.enderio.conduit.gui.item.IItemFilterGui;
import crazypants.enderio.conduit.gui.item.PowerItemFilterGui;
import crazypants.enderio.conduit.item.IItemConduit;
import io.netty.buffer.ByteBuf;
import java.util.List;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import cofh.api.energy.IEnergyContainerItem;
import com.enderio.core.client.gui.widget.GhostSlot;
import com.enderio.core.common.network.NetworkUtil;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import crazypants.enderio.conduit.item.NetworkedInventory;
/**
*
* @author matthias
*/
public class PowerItemFilter implements IItemFilter {
public enum CmpMode {
LESS,
LESS_EQUAL,
EQUAL,
MORE_EQUAL,
MORE;
public CmpMode next() {
CmpMode[] values = values();
return values[(ordinal() + 1) % values.length];
}
}
public static final int MAX_LEVEL = 4;
CmpMode mode = CmpMode.EQUAL;
boolean sticky;
int level = MAX_LEVEL;
@Override
public boolean doesItemPassFilter(NetworkedInventory inv, ItemStack item) {
if(item != null && item.getItem() instanceof IEnergyContainerItem) {
IEnergyContainerItem chargable = (IEnergyContainerItem) item.getItem();
int max = chargable.getMaxEnergyStored(item);
int cur = chargable.getEnergyStored(item);
int ref = (int)((long)max * level / MAX_LEVEL);
switch (mode) {
case LESS: return cur < ref;
case LESS_EQUAL: return cur <= ref;
case EQUAL: return cur == ref;
case MORE_EQUAL: return cur >= ref;
case MORE: return cur > ref;
default: return false;
}
}
return false;
}
@Override
public boolean doesFilterCaptureStack(NetworkedInventory inv, ItemStack item) {
boolean res = sticky && doesItemPassFilter(inv, item);
return res;
}
@Override
public boolean isValid() {
return true;
}
@Override
public boolean isSticky() {
return sticky;
}
public void setSticky(boolean sticky) {
this.sticky = sticky;
}
@Override
public void createGhostSlots(List<GhostSlot> slots, int xOffset, int yOffset, Runnable cb) {
}
@Override
public int getSlotCount() {
return 0;
}
public CmpMode getMode() {
return mode;
}
public void setMode(CmpMode mode) {
this.mode = mode;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
@Override
@SideOnly(Side.CLIENT)
public IItemFilterGui getGui(GuiExternalConnection gui, IItemConduit itemConduit, boolean isInput) {
return new PowerItemFilterGui(gui, itemConduit, isInput);
}
@Override
public void readFromNBT(NBTTagCompound nbtRoot) {
readSettingsFromNBT(nbtRoot);
}
protected void readSettingsFromNBT(NBTTagCompound nbtRoot) {
mode = CmpMode.values()[nbtRoot.getByte("mode") & 255];
level = nbtRoot.getShort("level");
sticky = nbtRoot.getBoolean("sticky");
}
@Override
public void writeToNBT(NBTTagCompound nbtRoot) {
writeSettingToNBT(nbtRoot);
}
protected void writeSettingToNBT(NBTTagCompound nbtRoot) {
nbtRoot.setByte("mode", (byte)mode.ordinal());
nbtRoot.setShort("level", (short)level);
nbtRoot.setBoolean("sticky", sticky);
}
@Override
public void writeToByteBuf(ByteBuf buf) {
NBTTagCompound settingsTag = new NBTTagCompound();
writeSettingToNBT(settingsTag);
NetworkUtil.writeNBTTagCompound(settingsTag, buf);
}
@Override
public void readFromByteBuf(ByteBuf buf) {
NBTTagCompound settingsTag = NetworkUtil.readNBTTagCompound(buf);
readSettingsFromNBT(settingsTag);
}
}