package shedar.mods.ic2.nuclearcontrol.items;
import net.minecraft.world.World;
import shedar.mods.ic2.nuclearcontrol.crossmod.EnergyStorageData;
import ic2.api.energy.EnergyNet;
import ic2.core.block.generator.tileentity.TileEntityBaseGenerator;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.util.IIcon;
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.IPanelMultiCard;
import shedar.mods.ic2.nuclearcontrol.api.IRangeTriggerable;
import shedar.mods.ic2.nuclearcontrol.api.IRemoteSensor;
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.tileentities.TileEntityAverageCounter;
import shedar.mods.ic2.nuclearcontrol.tileentities.TileEntityEnergyCounter;
import shedar.mods.ic2.nuclearcontrol.utils.LangHelper;
import shedar.mods.ic2.nuclearcontrol.utils.LiquidStorageHelper;
import shedar.mods.ic2.nuclearcontrol.utils.StringUtils;
import shedar.mods.ic2.nuclearcontrol.utils.TextureResolver;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class ItemCardMultipleSensorLocation extends ItemCardBase implements IRemoteSensor, IPanelMultiCard, IRangeTriggerable {
private static final String HINT_TEMPLATE = "x: %d, y: %d, z: %d";
public static final int DISPLAY_ENERGY = 1;
public static final int DISPLAY_LIQUID_NAME = 1;
public static final int DISPLAY_LIQUID_AMOUNT = 2;
public static final int DISPLAY_LIQUID_FREE = 4;
public static final int DISPLAY_LIQUID_CAPACITY = 8;
public static final int DISPLAY_LIQUID_PERCENTAGE = 16;
private static final UUID CARD_TYPE_COUNTER = new UUID(0, 4);
private static final UUID CARD_TYPE_LIQUID = UUID.fromString("210dc1f0-118c-48ee-9d08-42bfbee1ea15");
private static final UUID CARD_TYPE_GENERATOR = UUID.fromString("210dc1f0-118c-48ee-9d08-42bfbee1ea16");
private static final String TEXTURE_CARD_COUNTER = "cardCounter";
private static final String TEXTURE_CARD_LIQUID = "cardLiquid";
private static final String TEXTURE_CARD_GENERATOR = "cardGenerator";
private IIcon iconCounter;
private IIcon iconLiquid;
private IIcon iconGenerator;
public ItemCardMultipleSensorLocation() {
super("");
}
@Override
public void registerIcons(IIconRegister iconRegister) {
iconCounter = iconRegister.registerIcon(TextureResolver.getItemTexture(TEXTURE_CARD_COUNTER));
iconLiquid = iconRegister.registerIcon(TextureResolver.getItemTexture(TEXTURE_CARD_LIQUID));
iconGenerator = iconRegister.registerIcon(TextureResolver.getItemTexture(TEXTURE_CARD_GENERATOR));
}
@Override
public String getUnlocalizedName(ItemStack stack) {
int damage = stack.getItemDamage();
switch (damage) {
case ItemKitMultipleSensor.TYPE_COUNTER:
return "item.itemCounterSensorLocationCard";
case ItemKitMultipleSensor.TYPE_LIQUID:
return "item.ItemLiquidSensorLocationCard";
case ItemKitMultipleSensor.TYPE_GENERATOR:
return "item.ItemGeneratorSensorLocationCard";
}
return "";
}
@Override
public CardState update(TileEntity panel, ICardWrapper card, int range) {
int damage = card.getItemStack().getItemDamage();
switch (damage) {
case ItemKitMultipleSensor.TYPE_COUNTER:
return updateCounter(panel.getWorldObj(), card, range);
case ItemKitMultipleSensor.TYPE_LIQUID:
return updateLiquid(panel.getWorldObj(), card, range);
case ItemKitMultipleSensor.TYPE_GENERATOR:
return updateGenerator(panel.getWorldObj(), card, range);
}
return CardState.INVALID_CARD;
}
@Override
public CardState update(World world, ICardWrapper card, int range) {
int damage = card.getItemStack().getItemDamage();
switch (damage) {
case ItemKitMultipleSensor.TYPE_COUNTER:
return updateCounter(world, card, range);
case ItemKitMultipleSensor.TYPE_LIQUID:
return updateLiquid(world, card, range);
case ItemKitMultipleSensor.TYPE_GENERATOR:
return updateGenerator(world, card, range);
}
return CardState.INVALID_CARD;
}
public CardState updateLiquid(World world, ICardWrapper card, int range) {
ChunkCoordinates target = card.getTarget();
if(target == null) return CardState.NO_TARGET;
FluidTankInfo storage = LiquidStorageHelper.getStorageAt(world, target.posX, target.posY, target.posZ);
if (storage != null) {
int capacity = storage.capacity;
int amount = 0;
int liquidId = 0;
NBTTagCompound liquidTag = null;
if (storage.fluid != null) {
amount = storage.fluid.amount;
if (storage.fluid.getFluidID() != 0 && amount > 0) {
liquidId = storage.fluid.getFluidID();
liquidTag = storage.fluid.tag;
}
}
card.setInt("capacity", capacity);
card.setInt("amount", amount);
card.setInt("liquidId", liquidId);
card.setTag("liquidTag", liquidTag);
card.setDouble("range_trigger_amount", (double)amount);
return CardState.OK;
} else {
return CardState.NO_TARGET;
}
}
public CardState updateCounter(World world, ICardWrapper card, int range) {
ChunkCoordinates target = card.getTarget();
if(target == null) return CardState.NO_TARGET;
TileEntity tileEntity = world.getTileEntity(target.posX, target.posY, target.posZ);
if (tileEntity != null && tileEntity instanceof TileEntityEnergyCounter) {
TileEntityEnergyCounter counter = (TileEntityEnergyCounter) tileEntity;
card.setDouble("energy", counter.counter);
card.setDouble("range_trigger_amount", counter.counter);
card.setInt("powerType", (int) counter.powerType);
return CardState.OK;
} else if (tileEntity != null && tileEntity instanceof TileEntityAverageCounter) {
TileEntityAverageCounter avgCounter = (TileEntityAverageCounter) tileEntity;
card.setInt("average", avgCounter.getClientAverage());
card.setDouble("range_trigger_amount", (double)avgCounter.getClientAverage());
card.setInt("powerType", (int) avgCounter.powerType);
return CardState.OK;
} else {
return CardState.NO_TARGET;
}
}
public CardState updateGenerator(World world, ICardWrapper card, int range) {
ChunkCoordinates target = card.getTarget();
if(target == null) return CardState.NO_TARGET;
TileEntity entity = world.getTileEntity(target.posX, target.posY, target.posZ);
if (entity instanceof TileEntityBaseGenerator) {
// int production = ((TileEntityBaseGenerator)entity).production;
int production = (int) EnergyNet.instance.getNodeStats(entity).getEnergyOut();
card.setInt("production", production);
card.setDouble("range_trigger_amount", (double)production);
return CardState.OK;
} else {
return CardState.NO_TARGET;
}
}
@Override
public List<PanelSetting> getSettingsList(ICardWrapper card) {
int damage = card.getItemStack().getItemDamage();
switch (damage) {
case ItemKitMultipleSensor.TYPE_COUNTER:
return getSettingsListCounter();
case ItemKitMultipleSensor.TYPE_LIQUID:
return getSettingsListLiquid();
case ItemKitMultipleSensor.TYPE_GENERATOR:
return getSettingsListGenerator();
}
return null;
}
@Override
public UUID getCardType(ICardWrapper card) {
int damage = card.getItemStack().getItemDamage();
switch (damage) {
case ItemKitMultipleSensor.TYPE_COUNTER:
return CARD_TYPE_COUNTER;
case ItemKitMultipleSensor.TYPE_LIQUID:
return CARD_TYPE_LIQUID;
case ItemKitMultipleSensor.TYPE_GENERATOR:
return CARD_TYPE_GENERATOR;
}
return null;
}
@Override
public List<PanelString> getStringData(int displaySettings, ICardWrapper card, boolean showLabels) {
int damage = card.getItemStack().getItemDamage();
switch (damage) {
case ItemKitMultipleSensor.TYPE_COUNTER:
return getStringDataCounter(displaySettings, card, showLabels);
case ItemKitMultipleSensor.TYPE_LIQUID:
return getStringDataLiquid(displaySettings, card, showLabels);
case ItemKitMultipleSensor.TYPE_GENERATOR:
return getStringDataGenerator(displaySettings, card, showLabels);
}
return null;
}
public List<PanelString> getStringDataLiquid(int displaySettings, ICardWrapper card, boolean showLabels) {
List<PanelString> result = new LinkedList<PanelString>();
PanelString line;
int capacity = card.getInt("capacity");
int amount = card.getInt("amount");
if ((displaySettings & DISPLAY_LIQUID_NAME) > 0) {
int liquidId = card.getInt("liquidId");
String name;
if (liquidId == 0)
name = LangHelper.translate("msg.nc.None");
else
name = FluidRegistry.getFluidName(liquidId); //TODO deprecated
line = new PanelString();
line.textLeft = StringUtils.getFormatted("msg.nc.InfoPanelLiquidName", name, showLabels);
result.add(line);
}
if ((displaySettings & DISPLAY_LIQUID_AMOUNT) > 0) {
line = new PanelString();
line.textLeft = StringUtils.getFormatted("msg.nc.InfoPanelLiquidAmount", amount, showLabels);
result.add(line);
}
if ((displaySettings & DISPLAY_LIQUID_FREE) > 0) {
line = new PanelString();
line.textLeft = StringUtils.getFormatted("msg.nc.InfoPanelLiquidFree", capacity - amount, showLabels);
result.add(line);
}
if ((displaySettings & DISPLAY_LIQUID_CAPACITY) > 0) {
line = new PanelString();
line.textLeft = StringUtils.getFormatted("msg.nc.InfoPanelLiquidCapacity", capacity, showLabels);
result.add(line);
}
if ((displaySettings & DISPLAY_LIQUID_PERCENTAGE) > 0) {
line = new PanelString();
line.textLeft = StringUtils.getFormatted("msg.nc.InfoPanelLiquidPercentage",
capacity == 0 ? 100 : (amount * 100 / capacity), showLabels);
result.add(line);
}
return result;
}
public List<PanelString> getStringDataCounter(int displaySettings, ICardWrapper card, boolean showLabels) {
List<PanelString> result = new LinkedList<PanelString>();
PanelString line;
if (card.hasField("average")) {// average counter
if ((displaySettings & DISPLAY_ENERGY) > 0) {
line = new PanelString();
String key = card.getInt("powerType") == EnergyStorageData.TARGET_TYPE_IC2 ?
"msg.nc.InfoPanelOutput" : "msg.nc.InfoPanelOutputMJ";
line.textLeft = StringUtils.getFormatted(key, card.getInt("average"), showLabels);
result.add(line);
}
} else {// energy counter
if ((displaySettings & DISPLAY_ENERGY) > 0) {
double energy = card.getDouble("energy");
line = new PanelString();
String key = card.getInt("powerType") == EnergyStorageData.TARGET_TYPE_IC2 ?
"msg.nc.InfoPanelEnergyCounter" : "msg.nc.InfoPanelEnergyCounterMJ";
line.textLeft = StringUtils.getFormatted(key, energy, showLabels);
result.add(line);
}
}
return result;
}
public List<PanelString> getStringDataGenerator(int displaySettings, ICardWrapper card, boolean showLabels) {
List<PanelString> result = new LinkedList<PanelString>();
PanelString line = new PanelString();
line.textLeft = StringUtils.getFormatted("msg.nc.InfoPanelOutput", card.getInt("production"), showLabels);
result.add(line);
return result;
}
@Override
public IIcon getIconFromDamage(int damage) {
switch (damage) {
case ItemKitMultipleSensor.TYPE_COUNTER:
return iconCounter;
case ItemKitMultipleSensor.TYPE_LIQUID:
return iconLiquid;
case ItemKitMultipleSensor.TYPE_GENERATOR:
return iconGenerator;
}
return null;
}
public List<PanelSetting> getSettingsListCounter() {
List<PanelSetting> result = new ArrayList<PanelSetting>(3);
result.add(new PanelSetting(LangHelper.translate("msg.nc.cbInfoPanelEnergyCurrent"),
DISPLAY_ENERGY, CARD_TYPE_COUNTER));
return result;
}
public List<PanelSetting> getSettingsListLiquid() {
List<PanelSetting> result = new ArrayList<PanelSetting>(3);
result.add(new PanelSetting(LangHelper.translate("msg.nc.cbInfoPanelLiquidName"),
DISPLAY_LIQUID_NAME, CARD_TYPE_LIQUID));
result.add(new PanelSetting(LangHelper.translate("msg.nc.cbInfoPanelLiquidAmount"),
DISPLAY_LIQUID_AMOUNT, CARD_TYPE_LIQUID));
result.add(new PanelSetting(LangHelper.translate("msg.nc.cbInfoPanelLiquidFree"),
DISPLAY_LIQUID_FREE, CARD_TYPE_LIQUID));
result.add(new PanelSetting(LangHelper.translate("msg.nc.cbInfoPanelLiquidCapacity"),
DISPLAY_LIQUID_CAPACITY, CARD_TYPE_LIQUID));
result.add(new PanelSetting(LangHelper.translate("msg.nc.cbInfoPanelLiquidPercentage"),
DISPLAY_LIQUID_PERCENTAGE, CARD_TYPE_LIQUID));
return result;
}
public List<PanelSetting> getSettingsListGenerator() {
return null;
}
@Override
@SideOnly(Side.CLIENT)
@SuppressWarnings({ "rawtypes", "unchecked" })
public void addInformation(ItemStack itemStack, EntityPlayer player, List info, boolean advanced) {
CardWrapperImpl helper = new CardWrapperImpl(itemStack, -1);
ChunkCoordinates target = helper.getTarget();
if (target != null) {
String title = helper.getTitle();
if (title != null && !title.isEmpty()) {
info.add(title);
}
String hint = String.format(HINT_TEMPLATE, target.posX, target.posY, target.posZ);
info.add(hint);
}
}
@Override
public List<PanelSetting> getSettingsList() {
return null;
}
@Override
public UUID getCardType() {
return null;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void getSubItems(Item item, CreativeTabs tab, List list) {
list.add(new ItemStack(item, 1, ItemKitMultipleSensor.TYPE_COUNTER));
list.add(new ItemStack(item, 1, ItemKitMultipleSensor.TYPE_LIQUID));
list.add(new ItemStack(item, 1, ItemKitMultipleSensor.TYPE_GENERATOR));
}
}