package shedar.mods.ic2.nuclearcontrol.tileentities; import ic2.core.IC2; import ic2.core.network.NetworkManager; import java.util.ArrayList; import java.util.List; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import shedar.mods.ic2.nuclearcontrol.IC2NuclearControl; import shedar.mods.ic2.nuclearcontrol.api.IPanelDataSource; import shedar.mods.ic2.nuclearcontrol.items.ItemUpgrade; import shedar.mods.ic2.nuclearcontrol.utils.BlockDamages; public class TileEntityAdvancedInfoPanel extends TileEntityInfoPanel { private byte prevPowerMode; public byte powerMode; private byte prevThickness; public byte thickness; private byte prevRotateHor; public byte rotateHor; private byte prevRotateVert; public byte rotateVert; public ItemStack card2; public ItemStack card3; private static final byte SLOT_CARD1 = 0; private static final byte SLOT_CARD2 = 1; private static final byte SLOT_CARD3 = 2; private static final byte SLOT_UPGRADE_RANGE = 3; private static final byte SLOT_UPGRADE_WEB = 3; public static final int POWER_REDSTONE = 0; public static final int POWER_INVERTED = 1; public static final int POWER_ON = 2; public static final int POWER_OFF = 3; public static final int OFFSET_THICKNESS = 100; public static final int OFFSET_ROTATE_HOR = 200; public static final int OFFSET_ROTATE_VERT = 300; public TileEntityAdvancedInfoPanel() { super(4); //3 cards + range/web upgrade colored = true; thickness = 16; } @Override public int getCardSlotsCount() { return 3; } public byte getPowerMode() { return powerMode; } public void setPowerMode(byte p) { powerMode = p; if (prevPowerMode != p) { IC2.network.get().updateTileEntityField(this, "powerMode"); } prevPowerMode = powerMode; } public void setThickness(byte p) { thickness = p; if (prevThickness != p) { IC2.network.get().updateTileEntityField(this, "thickness"); } prevThickness = thickness; } public byte getThickness(){ return thickness; } public void setRotateHor(byte p) { rotateHor = p; if (prevRotateHor != p) { IC2.network.get().updateTileEntityField(this, "rotateHor"); } prevRotateHor = rotateHor; } public byte getRotationHor(){ return rotateHor; } public void setRotateVert(byte p) { rotateVert = p; if (prevRotateVert != p) { IC2.network.get().updateTileEntityField(this, "rotateVert"); } prevRotateVert = rotateVert; } public byte getRotationVert(){ return rotateVert; } @Override public List<String> getNetworkedFields() { List<String> list = super.getNetworkedFields(); list.add("card2"); list.add("card3"); list.add("powerMode"); list.add("thickness"); list.add("rotateHor"); list.add("rotateVert"); return list; } @Override public void onNetworkUpdate(String field) { super.onNetworkUpdate(field); if (field.equals("card2")) { inventory[SLOT_CARD2] = card2; } else if (field.equals("card3")) { inventory[SLOT_CARD3] = card3; } else if (field.equals("powerMode") && prevPowerMode != powerMode) { if (screen != null) { screen.turnPower(getPowered(), worldObj); } else { worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); worldObj.func_147451_t(xCoord, yCoord, zCoord); } prevPowerMode = powerMode; } else if (field.equals("thickness") || field.equals("rotateHor") || field.equals("rotateVert")) { worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); } } @Override public boolean isItemValid(int slotIndex, ItemStack itemstack) { switch (slotIndex) { case SLOT_CARD1: case SLOT_CARD2: case SLOT_CARD3: return itemstack.getItem() instanceof IPanelDataSource; case SLOT_UPGRADE_RANGE: return itemstack.getItem() instanceof ItemUpgrade && (itemstack.getItemDamage() == ItemUpgrade.DAMAGE_RANGE || itemstack .getItemDamage() == ItemUpgrade.DAMAGE_WEB); default: return false; } } @Override protected boolean isColoredEval() { return true; } @Override protected boolean isWebEval() { ItemStack itemStack = inventory[SLOT_UPGRADE_WEB]; return itemStack != null && itemStack.getItem() instanceof ItemUpgrade && itemStack.getItemDamage() == ItemUpgrade.DAMAGE_WEB; } @Override protected ItemStack getRangeUpgrade() { return inventory[SLOT_UPGRADE_RANGE]; } @Override public List<ItemStack> getCards() { List<ItemStack> data = new ArrayList<ItemStack>(3); data.add(inventory[SLOT_CARD1]); data.add(inventory[SLOT_CARD2]); data.add(inventory[SLOT_CARD3]); return data; } @Override protected boolean isCardSlot(int slot) { return slot == SLOT_CARD1 || slot == SLOT_CARD2 || slot == SLOT_CARD3; } @Override protected void saveDisplaySettings(NBTTagCompound nbttagcompound) { nbttagcompound.setTag("dSettings1", serializeSlotSettings(SLOT_CARD1)); nbttagcompound.setTag("dSettings2", serializeSlotSettings(SLOT_CARD2)); nbttagcompound.setTag("dSettings3", serializeSlotSettings(SLOT_CARD3)); nbttagcompound.setByte("rotateHor", rotateHor); nbttagcompound.setByte("rotateVert", rotateVert); nbttagcompound.setByte("thickness", thickness); nbttagcompound.setByte("powerMode", powerMode); } @Override protected void readDisplaySettings(NBTTagCompound nbttagcompound) { deserializeDisplaySettings(nbttagcompound, "dSettings1", SLOT_CARD1); deserializeDisplaySettings(nbttagcompound, "dSettings2", SLOT_CARD2); deserializeDisplaySettings(nbttagcompound, "dSettings3", SLOT_CARD3); rotateHor = nbttagcompound.getByte("rotateHor"); rotateVert = nbttagcompound.getByte("rotateVert"); thickness = nbttagcompound.getByte("thickness"); powerMode = nbttagcompound.getByte("powerMode"); } @Override protected void postReadFromNBT() { if (inventory[SLOT_CARD1] != null) { card = inventory[SLOT_CARD1]; } if (inventory[SLOT_CARD2] != null) { card2 = inventory[SLOT_CARD2]; } if (inventory[SLOT_CARD3] != null) { card3 = inventory[SLOT_CARD3]; } } public byte getNextPowerMode() { switch (powerMode) { case POWER_REDSTONE: return POWER_INVERTED; case POWER_INVERTED: return POWER_ON; case POWER_ON: return POWER_OFF; case POWER_OFF: return POWER_REDSTONE; } return POWER_REDSTONE; } @Override public boolean getPowered() { switch (powerMode) { case POWER_ON: return true; case POWER_OFF: return false; case POWER_REDSTONE: return powered; case POWER_INVERTED: return !powered; } return false; } @Override public void onNetworkEvent(EntityPlayer entityplayer, int i) { super.onNetworkEvent(entityplayer, i); if (i >= 0 && i < 100) { switch (i) { case POWER_ON: case POWER_OFF: case POWER_REDSTONE: case POWER_INVERTED: setPowerMode((byte) i); } } else if (i >= OFFSET_THICKNESS && i < OFFSET_THICKNESS + 100) { i -= OFFSET_THICKNESS; setThickness((byte) i); } else if (i >= OFFSET_ROTATE_HOR && i < OFFSET_ROTATE_HOR + 100) { i -= OFFSET_ROTATE_HOR + 8; i = -(i * 7); setRotateHor((byte) i); } else if (i >= OFFSET_ROTATE_VERT && i < OFFSET_ROTATE_VERT + 100) { i -= OFFSET_ROTATE_VERT + 8; i = -(i * 7); setRotateVert((byte) i); } } @Override public ItemStack getWrenchDrop(EntityPlayer entityPlayer) { return new ItemStack(IC2NuclearControl.blockNuclearControlMain, 1, BlockDamages.DAMAGE_ADVANCED_PANEL); } }