package shedar.mods.ic2.nuclearcontrol.items; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.UUID; import java.util.Vector; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChunkCoordinates; import net.minecraft.world.World; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidTankInfo; import shedar.mods.ic2.nuclearcontrol.api.CardState; import shedar.mods.ic2.nuclearcontrol.api.ICardWrapper; import shedar.mods.ic2.nuclearcontrol.api.PanelSetting; import shedar.mods.ic2.nuclearcontrol.api.PanelString; import shedar.mods.ic2.nuclearcontrol.panel.CardWrapperImpl; import shedar.mods.ic2.nuclearcontrol.utils.LangHelper; import shedar.mods.ic2.nuclearcontrol.utils.LiquidStorageHelper; import shedar.mods.ic2.nuclearcontrol.utils.StringUtils; public class ItemCardLiquidArrayLocation extends ItemCardBase { public static final int DISPLAY_NAME = 1; public static final int DISPLAY_AMOUNT = 2; public static final int DISPLAY_FREE = 4; public static final int DISPLAY_CAPACITY = 8; public static final int DISPLAY_PERCENTAGE = 16; public static final int DISPLAY_EACH = 32; public static final int DISPLAY_TOTAL = 64; private static final int STATUS_NOT_FOUND = Integer.MIN_VALUE; private static final int STATUS_OUT_OF_RANGE = Integer.MIN_VALUE + 1; public static final UUID CARD_TYPE = new UUID(0, 3); public ItemCardLiquidArrayLocation() { super("cardLiquidArray"); } private int[] getCoordinates(ICardWrapper card, int cardNumber) { int cardCount = card.getInt("cardCount"); if (cardNumber >= cardCount) return null; int[] coordinates = new int[] { card.getInt(String.format("_%dx", cardNumber)), card.getInt(String.format("_%dy", cardNumber)), card.getInt(String.format("_%dz", cardNumber)) }; return coordinates; } public static int getCardCount(ICardWrapper card) { return card.getInt("cardCount"); } public static void initArray(CardWrapperImpl card, Vector<ItemStack> cards) { int cardCount = getCardCount(card); for (ItemStack subCard : cards) { CardWrapperImpl wrapper = new CardWrapperImpl(subCard, -1); ChunkCoordinates target = wrapper.getTarget(); if (target == null) continue; card.setInt(String.format("_%dx", cardCount), target.posX); card.setInt(String.format("_%dy", cardCount), target.posY); card.setInt(String.format("_%dz", cardCount), target.posZ); card.setInt(String.format("_%dtargetType", cardCount), wrapper.getInt("targetType")); cardCount++; } card.setInt("cardCount", cardCount); } @Override public CardState update(TileEntity panel, ICardWrapper card, int range) { int cardCount = getCardCount(card); double totalAmount = 0.0; if (cardCount == 0) { return CardState.INVALID_CARD; } else { boolean foundAny = false; boolean outOfRange = false; int liquidId = 0; for (int i = 0; i < cardCount; i++) { int[] coordinates = getCoordinates(card, i); int dx = coordinates[0] - panel.xCoord; int dy = coordinates[1] - panel.yCoord; int dz = coordinates[2] - panel.zCoord; if (Math.abs(dx) <= range && Math.abs(dy) <= range && Math.abs(dz) <= range) { FluidTankInfo storage = LiquidStorageHelper.getStorageAt( panel.getWorldObj(), coordinates[0], coordinates[1], coordinates[2]); if (storage != null) { if (storage.fluid != null) { totalAmount += storage.fluid.amount; card.setInt(String.format("_%damount", i), storage.fluid.amount); if (storage.fluid.getFluidID() != 0 && storage.fluid.amount > 0) { liquidId = storage.fluid.getFluidID(); } if (liquidId == 0) card.setString(String.format("_%dname", i), LangHelper.translate("msg.nc.None")); else card.setString(String.format("_%dname", i), FluidRegistry.getFluidName(storage.fluid)); } card.setInt(String.format("_%dcapacity", i), storage.capacity); foundAny = true; } else { card.setInt(String.format("_%damount", i), STATUS_NOT_FOUND); } } else { card.setInt(String.format("_%damount", i), STATUS_OUT_OF_RANGE); outOfRange = true; } } card.setDouble("energyL", totalAmount); if (!foundAny) { if (outOfRange) return CardState.OUT_OF_RANGE; else return CardState.NO_TARGET; } return CardState.OK; } } @Override public CardState update(World world, ICardWrapper card, int range) { return CardState.CUSTOM_ERROR; } @Override public UUID getCardType() { return CARD_TYPE; } @Override public List<PanelString> getStringData(int displaySettings, ICardWrapper card, boolean showLabels) { List<PanelString> result = new LinkedList<PanelString>(); PanelString line; double totalAmount = 0; double totalCapacity = 0; boolean showEach = (displaySettings & DISPLAY_EACH) > 0; boolean showSummary = (displaySettings & DISPLAY_TOTAL) > 0; boolean showName = (displaySettings & DISPLAY_NAME) > 0; boolean showAmount = true;// (displaySettings & DISPLAY_AMOUNT) > 0; boolean showFree = (displaySettings & DISPLAY_FREE) > 0; boolean showCapacity = (displaySettings & DISPLAY_CAPACITY) > 0; boolean showPercentage = (displaySettings & DISPLAY_PERCENTAGE) > 0; int cardCount = getCardCount(card); for (int i = 0; i < cardCount; i++) { int amount = card.getInt(String.format("_%damount", i)); int capacity = card.getInt(String.format("_%dcapacity", i)); boolean isOutOfRange = amount == STATUS_OUT_OF_RANGE; boolean isNotFound = amount == STATUS_NOT_FOUND; if (showSummary && !isOutOfRange && !isNotFound) { totalAmount += amount; totalCapacity += capacity; } if (showEach) { if (isOutOfRange) { line = new PanelString(); line.textLeft = StringUtils.getFormattedKey("msg.nc.InfoPanelOutOfRangeN", i + 1); result.add(line); } else if (isNotFound) { line = new PanelString(); line.textLeft = StringUtils.getFormattedKey("msg.nc.InfoPanelNotFoundN", i + 1); result.add(line); } else { if (showName) { line = new PanelString(); if (showLabels) line.textLeft = StringUtils.getFormattedKey("msg.nc.InfoPanelLiquidNameN", i + 1, card.getString(String.format("_%dname", i))); else line.textLeft = StringUtils.getFormatted("", amount, false); result.add(line); } if (showAmount) { line = new PanelString(); if (showLabels) line.textLeft = StringUtils.getFormattedKey("msg.nc.InfoPanelLiquidN", i + 1, StringUtils.getFormatted("", amount, false)); else line.textLeft = StringUtils.getFormatted("", amount, false); result.add(line); } if (showFree) { line = new PanelString(); if (showLabels) line.textLeft = StringUtils.getFormattedKey("msg.nc.InfoPanelLiquidFreeN", i + 1, StringUtils.getFormatted("", capacity - amount, false)); else line.textLeft = StringUtils.getFormatted("", capacity - amount, false); result.add(line); } if (showCapacity) { line = new PanelString(); if (showLabels) line.textLeft = StringUtils.getFormattedKey("msg.nc.InfoPanelLiquidCapacityN", i + 1, StringUtils.getFormatted("", capacity, false)); else line.textLeft = StringUtils.getFormatted("", capacity, false); result.add(line); } if (showPercentage) { line = new PanelString(); if (showLabels) line.textLeft = StringUtils.getFormattedKey("msg.nc.InfoPanelLiquidPercentageN", i + 1, StringUtils.getFormatted("", capacity == 0 ? 100 : (((double) amount / capacity) * 100), false)); else line.textLeft = StringUtils.getFormatted("", capacity == 0 ? 100 : (((double) amount / capacity) * 100), false); result.add(line); } } } } if (showSummary) { if (showAmount) { line = new PanelString(); line.textLeft = StringUtils.getFormatted("msg.nc.InfoPanelLiquidAmount", totalAmount, showLabels); result.add(line); } if (showFree) { line = new PanelString(); line.textLeft = StringUtils.getFormatted("msg.nc.InfoPanelLiquidFree", totalCapacity - totalAmount, showLabels); result.add(line); } if (showName) { line = new PanelString(); line.textLeft = StringUtils.getFormatted("msg.nc.InfoPanelLiquidCapacity", totalCapacity, showLabels); result.add(line); } if (showPercentage) { line = new PanelString(); line.textLeft = StringUtils.getFormatted("msg.nc.InfoPanelLiquidPercentage", totalCapacity == 0 ? 100 : ((totalAmount / totalCapacity) * 100), showLabels); result.add(line); } } return result; } @Override public List<PanelSetting> getSettingsList() { List<PanelSetting> result = new ArrayList<PanelSetting>(3); result.add(new PanelSetting(LangHelper.translate("msg.nc.cbInfoPanelLiquidName"), DISPLAY_NAME, CARD_TYPE)); // result.add(new // PanelSetting(LanguageHelper.translate("msg.nc.cbInfoPanelLiquidAmount"), // DISPLAY_AMOUNT, CARD_TYPE)); result.add(new PanelSetting(LangHelper.translate("msg.nc.cbInfoPanelLiquidFree"), DISPLAY_FREE, CARD_TYPE)); result.add(new PanelSetting(LangHelper.translate("msg.nc.cbInfoPanelLiquidCapacity"), DISPLAY_CAPACITY, CARD_TYPE)); result.add(new PanelSetting(LangHelper.translate("msg.nc.cbInfoPanelLiquidPercentage"), DISPLAY_PERCENTAGE, CARD_TYPE)); result.add(new PanelSetting(LangHelper.translate("msg.nc.cbInfoPanelLiquidEach"), DISPLAY_EACH, CARD_TYPE)); result.add(new PanelSetting(LangHelper.translate("msg.nc.cbInfoPanelLiquidTotal"), DISPLAY_TOTAL, CARD_TYPE)); return result; } @Override @SideOnly(Side.CLIENT) @SuppressWarnings({ "rawtypes", "unchecked" }) public void addInformation(ItemStack itemStack, EntityPlayer player, List info, boolean advanced) { CardWrapperImpl card = new CardWrapperImpl(itemStack, -1); int cardCount = getCardCount(card); if (cardCount > 0) { String title = card.getTitle(); if (title != null && !title.isEmpty()) { info.add(title); } String hint = String.format(LangHelper.translate("msg.nc.LiquidCardQuantity"), cardCount); info.add(hint); } } }