package shedar.mods.ic2.nuclearcontrol.items; import ic2.api.item.IC2Items; import ic2.api.reactor.IReactor; import ic2.api.reactor.IReactorChamber; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.UUID; import net.minecraft.block.Block; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChunkCoordinates; import net.minecraft.world.World; import shedar.mods.ic2.nuclearcontrol.IC2NuclearControl; import shedar.mods.ic2.nuclearcontrol.api.CardState; import shedar.mods.ic2.nuclearcontrol.api.ICardWrapper; 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.crossmod.ic2.IC2Cross.ReactorInfo; import shedar.mods.ic2.nuclearcontrol.utils.LangHelper; import shedar.mods.ic2.nuclearcontrol.utils.StringUtils; public class ItemCard55Reactor extends ItemCardEnergySensorLocation implements IRemoteSensor{ public ItemCard55Reactor() { this.setTextureName("nuclearcontrol:cardReactor"); } public static final int DISPLAY_ON = 1; public static final int DISPLAY_OUTPUTTank = 2; public static final int DISPLAY_INPUTTank = 4; public static final int DISPLAY_HeatUnits = 8; public static final int DISPLAY_CoreTemp = 16; public static final UUID CARD_TYPE1 = new UUID(0, 2); @Override public UUID getCardType() { return CARD_TYPE1; } @Override public CardState update(TileEntity panel, ICardWrapper card, int range) { ChunkCoordinates target = card.getTarget(); if(target == null) return CardState.NO_TARGET; //int targetType = card.getInt("targetType"); TileEntity check = panel.getWorldObj().getTileEntity(target.posX, target.posY, target.posZ); if(isReactorPart(check) || panel.getWorldObj().getBlock(target.posX, target.posY, target.posZ) == Block.getBlockFromItem(IC2Items.getItem("reactorvessel").getItem())){ IReactor reactor = this.getReactor(panel.getWorldObj(), target.posX, target.posY, target.posZ); if(reactor != null){ ReactorInfo info = IC2NuclearControl.instance.crossIc2.getReactorInfo((TileEntity) reactor); if(info == null) { return CardState.INVALID_CARD; } card.setBoolean("Online", info.isOnline); card.setInt("outputTank", info.outTank); card.setInt("inputTank", info.inTank); card.setInt("HeatUnits", info.emitHeat); card.setInt("CoreTempurature", info.coreTemp); return CardState.OK; }else{ return CardState.INVALID_CARD; } }else{ return CardState.NO_TARGET; } } @Override public CardState update(World world, ICardWrapper card, int range){ ChunkCoordinates target = card.getTarget(); if(target == null) return CardState.NO_TARGET; //int targetType = card.getInt("targetType"); TileEntity check = world.getTileEntity(target.posX, target.posY, target.posZ); if(isReactorPart(check) || world.getBlock(target.posX, target.posY, target.posZ) == Block.getBlockFromItem(IC2Items.getItem("reactorvessel").getItem())){ IReactor reactor = this.getReactor(world, target.posX, target.posY, target.posZ); if(reactor != null){ ReactorInfo info = IC2NuclearControl.instance.crossIc2.getReactorInfo((TileEntity) reactor); if(info == null) { return CardState.INVALID_CARD; } card.setBoolean("Online", info.isOnline); card.setInt("outputTank", info.outTank); card.setInt("inputTank", info.inTank); card.setInt("HeatUnits", info.emitHeat); card.setInt("CoreTempurature", info.coreTemp); return CardState.OK; }else{ return CardState.INVALID_CARD; } }else{ return CardState.NO_TARGET; } } /*This is taken directly from IC2's code, because I couldn't find a better way to do it || All credits to IC2 for this function*/ public static IReactor getReactor(World world, int xCoord, int yCoord, int zCoord){ for(int xoffset = -1; xoffset < 2; xoffset++){ for(int yoffset = -1; yoffset < 2; yoffset++){ for(int zoffset = -1; zoffset < 2; zoffset++){ TileEntity te = world.getTileEntity(xCoord + xoffset, yCoord + yoffset, zCoord + zoffset); if(te instanceof IReactor) { return (IReactor) te; } else if(te instanceof IReactorChamber) { return ((IReactorChamber)te).getReactor(); } } } } return null; } private boolean isReactorPart(TileEntity par1) { return IC2NuclearControl.instance.crossIc2.isMultiReactorPart(par1); } @Override public List<PanelString> getStringData(int displaySettings, ICardWrapper card, boolean showLabels) { List<PanelString> result = new LinkedList<PanelString>(); PanelString line; double tOut = card.getInt("outputTank"); double tIn = card.getInt("inputTank"); double heatUnits = card.getInt("HeatUnits"); double coreTemp = card.getInt("CoreTempurature"); //Temperature if ((displaySettings & DISPLAY_HeatUnits) > 0) { line = new PanelString(); line.textLeft = StringUtils.getFormatted("msg.nc.InfoPanel55.Output", heatUnits, showLabels); result.add(line); } //Stored Energy if ((displaySettings & DISPLAY_CoreTemp) > 0) { line = new PanelString(); line.textLeft = StringUtils.getFormatted("msg.nc.InfoPanel55.Temp", coreTemp, showLabels); result.add(line); } //Energy Created Frequency if ((displaySettings & DISPLAY_INPUTTank) > 0) { line = new PanelString(); line.textLeft = StringUtils.getFormatted("msg.nc.InfoPanel55.tarkin", tIn, showLabels); result.add(line); } //Output Percentage if ((displaySettings & DISPLAY_OUTPUTTank) > 0) { line = new PanelString(); line.textLeft = StringUtils.getFormatted("msg.nc.InfoPanel55.tankout", tOut, showLabels); result.add(line); } //On or Off int txtColor = 0; String text; if ((displaySettings & DISPLAY_ON) > 0) { boolean reactorPowered = card.getBoolean("Online"); if (reactorPowered) { txtColor = 0x00ff00; text = LangHelper.translate("msg.nc.InfoPanelOn"); } else { txtColor = 0xff0000; text = LangHelper.translate("msg.nc.InfoPanelOff"); } if (result.size() > 0) { PanelString firstLine = result.get(0); firstLine.textRight = text; firstLine.colorRight = txtColor; } else { line = new PanelString(); line.textLeft = text; line.colorLeft = txtColor; result.add(line); } } return result; } @Override public List<PanelSetting> getSettingsList() { List<PanelSetting> result = new ArrayList<PanelSetting>(5); result.add(new PanelSetting(LangHelper.translate("msg.nc.cbInfoPanelOnOff"), DISPLAY_ON, CARD_TYPE)); result.add(new PanelSetting(LangHelper.translate("msg.nc.InfoPanel55.BufferOut"), DISPLAY_OUTPUTTank, CARD_TYPE)); result.add(new PanelSetting(LangHelper.translate("msg.nc.InfoPanel55.BufferIn"), DISPLAY_INPUTTank, CARD_TYPE)); result.add(new PanelSetting(LangHelper.translate("msg.nc.InfoPanel55.Out"), DISPLAY_HeatUnits, CARD_TYPE)); result.add(new PanelSetting(LangHelper.translate("msg.nc.InfoPanelRF.TempPROPER"), DISPLAY_CoreTemp, CARD_TYPE)); return result; } }