package mekanism.generators.common.tile.reactor; import io.netty.buffer.ByteBuf; import java.util.ArrayList; import mekanism.common.Mekanism; import mekanism.common.util.MekanismUtils; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import cpw.mods.fml.common.Optional.Interface; import cpw.mods.fml.common.Optional.Method; import dan200.computercraft.api.lua.ILuaContext; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IPeripheral; @Interface(iface = "dan200.computercraft.api.peripheral.IPeripheral", modid = "ComputerCraft") public class TileEntityReactorLogicAdapter extends TileEntityReactorBlock implements IPeripheral { 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.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, 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 void writeToNBT(NBTTagCompound nbtTags) { super.writeToNBT(nbtTags); nbtTags.setInteger("logicType", logicType.ordinal()); nbtTags.setBoolean("activeCooled", activeCooled); } @Override public void handlePacketData(ByteBuf dataStream) { if(!worldObj.isRemote) { int type = dataStream.readInt(); if(type == 0) { activeCooled = !activeCooled; } else if(type == 1) { logicType = ReactorLogic.values()[dataStream.readInt()]; } return; } super.handlePacketData(dataStream); 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; } @Override @Method(modid = "ComputerCraft") public String getType() { return getInventoryName(); } @Override @Method(modid = "ComputerCraft") public boolean equals(IPeripheral other) { return this == other; } @Override @Method(modid = "ComputerCraft") public void attach(IComputerAccess computer) {} @Override @Method(modid = "ComputerCraft") public void detach(IComputerAccess computer) {} @Override @Method(modid = "ComputerCraft") public String[] getMethodNames() { return new String[] {"isIgnited", "canIgnite", "getPlasmaHeat", "getMaxPlasmaHeat", "getCaseHeat", "getMaxCaseHeat", "getInjectionRate", "setInjectionRate", "hasFuel"}; } @Override @Method(modid = "ComputerCraft") public Object[] callMethod(IComputerAccess computer, ILuaContext context, 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 Integer) { getReactor().setInjectionRate((Integer)arguments[0]); 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)}; default: Mekanism.logger.error("Attempted to call unknown method with computer ID " + computer.getID()); 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 MekanismUtils.localize("reactor." + name); } public String getDescription() { return MekanismUtils.localize("reactor." + name + ".desc"); } } }