package mekanism.generators.common.tile.reactor; import io.netty.buffer.ByteBuf; import java.util.ArrayList; import mekanism.common.integration.IComputerIntegration; import mekanism.common.util.LangUtils; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.fml.common.FMLCommonHandler; import dan200.computercraft.api.lua.LuaException; public class TileEntityReactorLogicAdapter extends TileEntityReactorBlock implements IComputerIntegration { public ReactorLogic logicType = ReactorLogic.DISABLED; public boolean activeCooled; public boolean prevOutputting; public TileEntityReactorLogicAdapter() { super(); fullName = "ReactorLogicAdapter"; } @Override public void onUpdate() { super.onUpdate(); if(!worldObj.isRemote) { boolean outputting = checkMode(); if(outputting != prevOutputting) { worldObj.notifyNeighborsOfStateChange(getPos(), getBlockType()); } prevOutputting = outputting; } } @Override public boolean isFrame() { return false; } public boolean checkMode() { if(worldObj.isRemote) { return prevOutputting; } if(getReactor() == null || !getReactor().isFormed()) { return false; } switch(logicType) { case DISABLED: return false; case READY: return getReactor().getPlasmaTemp() >= getReactor().getIgnitionTemperature(activeCooled); case CAPACITY: return getReactor().getPlasmaTemp() >= getReactor().getMaxPlasmaTemperature(activeCooled); case DEPLETED: return (getReactor().getDeuteriumTank().getStored() < getReactor().getInjectionRate()/2) || (getReactor().getTritiumTank().getStored() < getReactor().getInjectionRate()/2); default: return false; } } @Override public void readFromNBT(NBTTagCompound nbtTags) { super.readFromNBT(nbtTags); logicType = ReactorLogic.values()[nbtTags.getInteger("logicType")]; activeCooled = nbtTags.getBoolean("activeCooled"); } @Override public NBTTagCompound writeToNBT(NBTTagCompound nbtTags) { super.writeToNBT(nbtTags); nbtTags.setInteger("logicType", logicType.ordinal()); nbtTags.setBoolean("activeCooled", activeCooled); return nbtTags; } @Override public void handlePacketData(ByteBuf dataStream) { if(FMLCommonHandler.instance().getEffectiveSide().isServer()) { int type = dataStream.readInt(); if(type == 0) { activeCooled = !activeCooled; } else if(type == 1) { logicType = ReactorLogic.values()[dataStream.readInt()]; } return; } super.handlePacketData(dataStream); if(FMLCommonHandler.instance().getEffectiveSide().isClient()) { logicType = ReactorLogic.values()[dataStream.readInt()]; activeCooled = dataStream.readBoolean(); prevOutputting = dataStream.readBoolean(); } } @Override public ArrayList getNetworkedData(ArrayList data) { super.getNetworkedData(data); data.add(logicType.ordinal()); data.add(activeCooled); data.add(prevOutputting); return data; } private static final String[] methods = new String[] {"isIgnited", "canIgnite", "getPlasmaHeat", "getMaxPlasmaHeat", "getCaseHeat", "getMaxCaseHeat", "getInjectionRate", "setInjectionRate", "hasFuel", "getProducing", "getIgnitionTemp", "getEnergy", "getMaxEnergy", "getWater", "getSteam", "getFuel"}; @Override public String[] getMethods() { return methods; } @Override public Object[] invoke(int method, Object[] arguments) throws LuaException, InterruptedException { if(getReactor() == null || !getReactor().isFormed()) { return new Object[] {"Unformed."}; } switch(method) { case 0: return new Object[] {getReactor().isBurning()}; case 1: return new Object[] {getReactor().getPlasmaTemp() >= getReactor().getIgnitionTemperature(activeCooled)}; case 2: return new Object[] {getReactor().getPlasmaTemp()}; case 3: return new Object[] {getReactor().getMaxPlasmaTemperature(activeCooled)}; case 4: return new Object[] {getReactor().getCaseTemp()}; case 5: return new Object[] {getReactor().getMaxCasingTemperature(activeCooled)}; case 6: return new Object[] {getReactor().getInjectionRate()}; case 7: if(arguments[0] instanceof Double) { getReactor().setInjectionRate(((Double)arguments[0]).intValue()); return new Object[] {"Injection rate set."}; } else { return new Object[] {"Invalid parameters."}; } case 8: return new Object[] {(getReactor().getDeuteriumTank().getStored() >= getReactor().getInjectionRate()/2) && (getReactor().getTritiumTank().getStored() >= getReactor().getInjectionRate()/2)}; case 9: return new Object[] {getReactor().getPassiveGeneration(false, true)}; case 10: return new Object[] {getReactor().getIgnitionTemperature(activeCooled)}; case 11: return new Object[] {getReactor().getBufferedEnergy()}; case 12: return new Object[] {getReactor().getBufferSize()}; case 13: return new Object[] {getReactor().getWaterTank().getFluidAmount()}; case 14: return new Object[] {getReactor().getSteamTank().getFluidAmount()}; case 15: return new Object[] {getReactor().getFuelTank().getStored()}; default: return new Object[] {"Unknown command."}; } } public static enum ReactorLogic { DISABLED("disabled", new ItemStack(Items.GUNPOWDER)), READY("ready", new ItemStack(Items.REDSTONE)), CAPACITY("capacity", new ItemStack(Items.REDSTONE)), DEPLETED("depleted", new ItemStack(Items.REDSTONE)); private String name; private ItemStack renderStack; private ReactorLogic(String s, ItemStack stack) { name = s; renderStack = stack; } public ItemStack getRenderStack() { return renderStack; } public String getLocalizedName() { return LangUtils.localize("reactor." + name); } public String getDescription() { return LangUtils.localize("reactor." + name + ".desc"); } } }