From 9b1aa2099bd319cbbfcbb6a8d495695f903b0b5c Mon Sep 17 00:00:00 2001 From: "Aidan C. Brady" Date: Sun, 29 Mar 2015 12:50:15 -0400 Subject: [PATCH] Started work on Reactor Logic Adapters --- .../mekanism/api/reactor/IFusionReactor.java | 4 +- .../common/tile/TileEntityElectricBlock.java | 3 + .../generators/common/FusionReactor.java | 6 + .../common/GeneratorsCommonProxy.java | 8 +- .../generators/common/block/BlockReactor.java | 24 +-- .../TileEntityReactorLogicAdapter.java | 167 ++++++++++++++++++ .../tile/reactor/TileEntityReactorPort.java | 58 +++++- .../resources/assets/mekanism/lang/en_US.lang | 3 +- .../blocks/ctm/ReactorLogicAdapter-ctm.png | Bin 0 -> 3817 bytes .../blocks/ctm/ReactorLogicAdapter.png | Bin 0 -> 2660 bytes 10 files changed, 257 insertions(+), 16 deletions(-) create mode 100644 src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorLogicAdapter.java create mode 100644 src/main/resources/assets/mekanism/textures/blocks/ctm/ReactorLogicAdapter-ctm.png create mode 100644 src/main/resources/assets/mekanism/textures/blocks/ctm/ReactorLogicAdapter.png diff --git a/src/main/java/mekanism/api/reactor/IFusionReactor.java b/src/main/java/mekanism/api/reactor/IFusionReactor.java index ef19fc066..ecb2f66e7 100644 --- a/src/main/java/mekanism/api/reactor/IFusionReactor.java +++ b/src/main/java/mekanism/api/reactor/IFusionReactor.java @@ -2,7 +2,7 @@ package mekanism.api.reactor; import mekanism.api.IHeatTransfer; import mekanism.api.gas.GasTank; - +import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidTank; public interface IFusionReactor extends IHeatTransfer @@ -60,4 +60,6 @@ public interface IFusionReactor extends IHeatTransfer public int getSteamPerTick(boolean current); public void updateTemperatures(); + + public ItemStack[] getInventory(); } diff --git a/src/main/java/mekanism/common/tile/TileEntityElectricBlock.java b/src/main/java/mekanism/common/tile/TileEntityElectricBlock.java index 9201df98d..db4f367b0 100644 --- a/src/main/java/mekanism/common/tile/TileEntityElectricBlock.java +++ b/src/main/java/mekanism/common/tile/TileEntityElectricBlock.java @@ -136,6 +136,7 @@ public abstract class TileEntityElectricBlock extends TileEntityContainerBlock i public void handlePacketData(ByteBuf dataStream) { super.handlePacketData(dataStream); + setEnergy(dataStream.readDouble()); } @@ -143,7 +144,9 @@ public abstract class TileEntityElectricBlock extends TileEntityContainerBlock i public ArrayList getNetworkedData(ArrayList data) { super.getNetworkedData(data); + data.add(getEnergy()); + return data; } diff --git a/src/main/java/mekanism/generators/common/FusionReactor.java b/src/main/java/mekanism/generators/common/FusionReactor.java index 20897fd37..4a247485b 100644 --- a/src/main/java/mekanism/generators/common/FusionReactor.java +++ b/src/main/java/mekanism/generators/common/FusionReactor.java @@ -607,4 +607,10 @@ public class FusionReactor implements IFusionReactor { return null; } + + @Override + public ItemStack[] getInventory() + { + return isFormed() ? controller.inventory : null; + } } diff --git a/src/main/java/mekanism/generators/common/GeneratorsCommonProxy.java b/src/main/java/mekanism/generators/common/GeneratorsCommonProxy.java index c6ea83c61..63099c4c0 100644 --- a/src/main/java/mekanism/generators/common/GeneratorsCommonProxy.java +++ b/src/main/java/mekanism/generators/common/GeneratorsCommonProxy.java @@ -3,6 +3,7 @@ package mekanism.generators.common; import mekanism.api.MekanismConfig.generators; import mekanism.common.Mekanism; import mekanism.common.inventory.container.ContainerNull; +import mekanism.common.tile.TileEntityContainerBlock; import mekanism.generators.common.inventory.container.ContainerBioGenerator; import mekanism.generators.common.inventory.container.ContainerGasGenerator; import mekanism.generators.common.inventory.container.ContainerHeatGenerator; @@ -20,9 +21,9 @@ import mekanism.generators.common.tile.reactor.TileEntityReactorController; import mekanism.generators.common.tile.reactor.TileEntityReactorFrame; import mekanism.generators.common.tile.reactor.TileEntityReactorGlass; import mekanism.generators.common.tile.reactor.TileEntityReactorLaserFocusMatrix; +import mekanism.generators.common.tile.reactor.TileEntityReactorLogicAdapter; import mekanism.generators.common.tile.reactor.TileEntityReactorNeutronCapture; import mekanism.generators.common.tile.reactor.TileEntityReactorPort; - import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.tileentity.TileEntity; @@ -49,6 +50,7 @@ public class GeneratorsCommonProxy GameRegistry.registerTileEntity(TileEntityReactorLaserFocusMatrix.class, "ReactorLaserFocus"); GameRegistry.registerTileEntity(TileEntityReactorNeutronCapture.class, "ReactorNeutronCapture"); GameRegistry.registerTileEntity(TileEntityReactorPort.class, "ReactorPort"); + GameRegistry.registerTileEntity(TileEntityReactorLogicAdapter.class, "ReactorLogicAdapter"); } /** @@ -161,9 +163,11 @@ public class GeneratorsCommonProxy case 11: case 12: case 13: - return new ContainerNull(player, (TileEntityReactorController)tileEntity); + return new ContainerNull(player, (TileEntityContainerBlock)tileEntity); case 14: return new ContainerNeutronCapture(player.inventory, (TileEntityReactorNeutronCapture)tileEntity); + case 15: + return new ContainerNull(player, (TileEntityContainerBlock)tileEntity); } return null; diff --git a/src/main/java/mekanism/generators/common/block/BlockReactor.java b/src/main/java/mekanism/generators/common/block/BlockReactor.java index 6976fb9e6..f2ec2d0c2 100644 --- a/src/main/java/mekanism/generators/common/block/BlockReactor.java +++ b/src/main/java/mekanism/generators/common/block/BlockReactor.java @@ -5,7 +5,6 @@ import java.util.List; import java.util.Random; import mekanism.api.Coord4D; -import mekanism.client.ClientProxy; import mekanism.common.CTMData; import mekanism.common.ItemAttacher; import mekanism.common.Mekanism; @@ -19,9 +18,9 @@ import mekanism.generators.common.tile.reactor.TileEntityReactorController; import mekanism.generators.common.tile.reactor.TileEntityReactorFrame; import mekanism.generators.common.tile.reactor.TileEntityReactorGlass; import mekanism.generators.common.tile.reactor.TileEntityReactorLaserFocusMatrix; +import mekanism.generators.common.tile.reactor.TileEntityReactorLogicAdapter; import mekanism.generators.common.tile.reactor.TileEntityReactorNeutronCapture; import mekanism.generators.common.tile.reactor.TileEntityReactorPort; - import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; @@ -36,12 +35,10 @@ import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import cpw.mods.fml.common.ModAPIManager; +import buildcraft.api.tools.IToolWrench; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import buildcraft.api.tools.IToolWrench; - public class BlockReactor extends BlockContainer implements IBlockCTM { public IIcon[][] icons = new IIcon[16][16]; @@ -62,11 +59,12 @@ public class BlockReactor extends BlockContainer implements IBlockCTM { if(this == GeneratorsBlocks.Reactor) { - ctms[0][0] = new CTMData("ctm/ReactorFrame", this, Arrays.asList(0, 1, 2, 3)).addSideOverride(ForgeDirection.UP, "ctm/ReactorControllerOff").registerIcons(register); - ctms[0][1] = new CTMData("ctm/ReactorFrame", this, Arrays.asList(0, 1, 2, 3)).addSideOverride(ForgeDirection.UP, "ctm/ReactorControllerOn").registerIcons(register); - ctms[1][0] = new CTMData("ctm/ReactorFrame", this, Arrays.asList(0, 1, 2, 3)).registerIcons(register); - ctms[2][0] = new CTMData("ctm/ReactorNeutronCapture", this, Arrays.asList(0, 1, 2, 3)).registerIcons(register); - ctms[3][0] = new CTMData("ctm/ReactorPort", this, Arrays.asList(0, 1, 2, 3)).registerIcons(register); + ctms[0][0] = new CTMData("ctm/ReactorFrame", this, Arrays.asList(0, 1, 2, 3, 4)).addSideOverride(ForgeDirection.UP, "ctm/ReactorControllerOff").registerIcons(register); + ctms[0][1] = new CTMData("ctm/ReactorFrame", this, Arrays.asList(0, 1, 2, 3, 4)).addSideOverride(ForgeDirection.UP, "ctm/ReactorControllerOn").registerIcons(register); + ctms[1][0] = new CTMData("ctm/ReactorFrame", this, Arrays.asList(0, 1, 2, 3, 4)).registerIcons(register); + ctms[2][0] = new CTMData("ctm/ReactorNeutronCapture", this, Arrays.asList(0, 1, 2, 3, 4)).registerIcons(register); + ctms[3][0] = new CTMData("ctm/ReactorPort", this, Arrays.asList(0, 1, 2, 3, 4)).registerIcons(register); + ctms[4][0] = new CTMData("ctm/ReactorLogicAdapter", this, Arrays.asList(0, 1, 2, 3, 4)).registerIcons(register); icons[0][0] = ctms[0][0].sideOverrides[1].icon; icons[0][1] = ctms[0][1].sideOverrides[1].icon; @@ -74,6 +72,7 @@ public class BlockReactor extends BlockContainer implements IBlockCTM icons[1][0] = ctms[1][0].mainTextureData.icon; icons[2][0] = ctms[2][0].mainTextureData.icon; icons[3][0] = ctms[3][0].mainTextureData.icon; + icons[4][0] = ctms[4][0].mainTextureData.icon; } else if(this == GeneratorsBlocks.ReactorGlass) { @@ -321,9 +320,11 @@ public class BlockReactor extends BlockContainer implements IBlockCTM public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { Coord4D obj = new Coord4D(x, y, z).getFromSide(ForgeDirection.getOrientation(side).getOpposite()); + if(this == GeneratorsBlocks.ReactorGlass) { int metadata = obj.getMetadata(world); + switch(metadata) { case 0: @@ -343,7 +344,8 @@ public class BlockReactor extends BlockContainer implements IBlockCTM CONTROLLER(GeneratorsBlocks.Reactor, 0, "ReactorController", 10, TileEntityReactorController.class), FRAME(GeneratorsBlocks.Reactor, 1, "ReactorFrame", -1, TileEntityReactorFrame.class), NEUTRON_CAPTURE(GeneratorsBlocks.Reactor, 2, "ReactorNeutronCapturePlate", 14, TileEntityReactorNeutronCapture.class), - PORT(GeneratorsBlocks.Reactor, 3, "ReactorInOutPort", -1, TileEntityReactorPort.class), + PORT(GeneratorsBlocks.Reactor, 3, "ReactorPort", -1, TileEntityReactorPort.class), + ADAPTER(GeneratorsBlocks.Reactor, 4, "ReactorLogicAdapter", 15, TileEntityReactorLogicAdapter.class), GLASS(GeneratorsBlocks.ReactorGlass, 0, "ReactorGlass", -1, TileEntityReactorGlass.class), LASER_FOCUS_MATRIX(GeneratorsBlocks.ReactorGlass, 1, "ReactorLaserFocusMatrix", -1, TileEntityReactorLaserFocusMatrix.class); diff --git a/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorLogicAdapter.java b/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorLogicAdapter.java new file mode 100644 index 000000000..bebdadb75 --- /dev/null +++ b/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorLogicAdapter.java @@ -0,0 +1,167 @@ +package mekanism.generators.common.tile.reactor; + +import io.netty.buffer.ByteBuf; + +import java.util.ArrayList; +import java.util.List; + +import mekanism.common.util.MekanismUtils; +import net.minecraft.nbt.NBTTagCompound; +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; + +public class TileEntityReactorLogicAdapter extends TileEntityReactorBlock implements IPeripheral +{ + public ReactorLogic logicType; + + public boolean activeCooled; + + @Override + public boolean isFrame() + { + return false; + } + + public boolean checkMode(ReactorLogic type) + { + if(getReactor() == null || !getReactor().isFormed()) + { + return false; + } + + switch(type) + { + 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) + { + super.handlePacketData(dataStream); + + logicType = ReactorLogic.values()[dataStream.readInt()]; + activeCooled = dataStream.readBoolean(); + } + + @Override + public ArrayList getNetworkedData(ArrayList data) + { + super.getNetworkedData(data); + + data.add(logicType.ordinal()); + data.add(activeCooled); + + 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() + { + List ret = new ArrayList(); + + for(ReactorLogic type : ReactorLogic.values()) + { + if(type != ReactorLogic.DISABLED) + { + ret.add(type.name); + } + } + + return (String[])ret.toArray(); + } + + @Override + @Method(modid = "ComputerCraft") + public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException + { + if(method >= 0 && method < ReactorLogic.values().length-1) + { + ReactorLogic type = ReactorLogic.values()[method+1]; + + return new Object[] {checkMode(type)}; + } + else { + return new Object[] {"Unknown command."}; + } + } + + public static enum ReactorLogic + { + DISABLED("disabled"), + READY("ready"), + CAPACITY("capacity"), + DEPLETED("depleted"); + + private String name; + + private ReactorLogic(String s) + { + name = s; + } + + public String getLocalizedName() + { + return MekanismUtils.localize("reactor." + name); + } + + public String getDescription() + { + return MekanismUtils.localize("reactor." + name + ".desc"); + } + } +} diff --git a/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorPort.java b/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorPort.java index c5588a9de..fde17a63d 100644 --- a/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorPort.java +++ b/src/main/java/mekanism/generators/common/tile/reactor/TileEntityReactorPort.java @@ -12,7 +12,8 @@ import mekanism.api.gas.ITubeConnection; import mekanism.api.reactor.IReactorBlock; import mekanism.common.util.CableUtils; import mekanism.common.util.HeatUtils; - +import mekanism.common.util.InventoryUtils; +import mekanism.generators.common.item.ItemHohlraum; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; @@ -280,6 +281,7 @@ public class TileEntityReactorPort extends TileEntityReactorBlock implements IFl { return getReactor().applyTemperatureChange(); } + return 0; } @@ -293,10 +295,64 @@ public class TileEntityReactorPort extends TileEntityReactorBlock implements IFl public IHeatTransfer getAdjacent(ForgeDirection side) { TileEntity adj = Coord4D.get(this).getFromSide(side).getTileEntity(worldObj); + if(adj instanceof IHeatTransfer && !(adj instanceof IReactorBlock)) { return (IHeatTransfer)adj; } + return null; } + + @Override + public ItemStack getStackInSlot(int slotID) + { + return getReactor() != null && getReactor().isFormed() ? getReactor().getInventory()[slotID] : null; + } + + @Override + public void setInventorySlotContents(int slotID, ItemStack itemstack) + { + if(getReactor() != null && getReactor().isFormed()) + { + getReactor().getInventory()[slotID] = itemstack; + + if(itemstack != null && itemstack.stackSize > getInventoryStackLimit()) + { + itemstack.stackSize = getInventoryStackLimit(); + } + } + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) + { + return getReactor() != null && getReactor().isFormed() ? new int[] {0} : InventoryUtils.EMPTY; + } + + @Override + public boolean isItemValidForSlot(int slotID, ItemStack itemstack) + { + if(getReactor() != null && getReactor().isFormed() && itemstack.getItem() instanceof ItemHohlraum) + { + ItemHohlraum hohlraum = (ItemHohlraum)itemstack.getItem(); + + return hohlraum.getGas(itemstack) != null && hohlraum.getGas(itemstack).amount == hohlraum.getMaxGas(itemstack); + } + + return false; + } + + @Override + public boolean canExtractItem(int slotID, ItemStack itemstack, int side) + { + if(getReactor() != null && getReactor().isFormed() && itemstack.getItem() instanceof ItemHohlraum) + { + ItemHohlraum hohlraum = (ItemHohlraum)itemstack.getItem(); + + return hohlraum.getGas(itemstack) == null; + } + + return false; + } } \ No newline at end of file diff --git a/src/main/resources/assets/mekanism/lang/en_US.lang b/src/main/resources/assets/mekanism/lang/en_US.lang index 66d9aadca..539af6057 100644 --- a/src/main/resources/assets/mekanism/lang/en_US.lang +++ b/src/main/resources/assets/mekanism/lang/en_US.lang @@ -814,7 +814,8 @@ tile.Generator.WindTurbine.name=Wind Turbine tile.Reactor.ReactorController.name=Reactor Controller tile.Reactor.ReactorFrame.name=Reactor Frame tile.Reactor.ReactorNeutronCapturePlate.name=Neutron Capture Plate -tile.Reactor.ReactorInOutPort.name=Reactor Port +tile.Reactor.ReactorPort.name=Reactor Port +tile.Reactor.ReactorLogicAdapter.name=Reactor Logic Adapter tile.ReactorGlass.ReactorGlass.name=Reactor Glass tile.ReactorGlass.ReactorLaserFocusMatrix.name=Laser Focus Matrix diff --git a/src/main/resources/assets/mekanism/textures/blocks/ctm/ReactorLogicAdapter-ctm.png b/src/main/resources/assets/mekanism/textures/blocks/ctm/ReactorLogicAdapter-ctm.png new file mode 100644 index 0000000000000000000000000000000000000000..aba84ffe814acac4ca1a0c1ad52ece3553c443fe GIT binary patch literal 3817 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

e5 zpc7VVMpEYo^nu^$EiG0z;@j9=t2R>BQsoEqh2Qb^o*%$W5C*5tPjI{@0g5{%{>1U= z^8;+%(F1P~bZPsOo z{8TtK{(2ry#j|(s-Zdl(_+ciT0XP(8keuTYGNLb>?sB?A>23V9m;Vr<4FLvceDwDu z1S~z@C+y`wl=rlwFND+XOoy`=C63aOi0ASX46$F-)&m+_-fEogQaQ@Ef9g~l1HH4I z;I<9_Ef0QE0S3k~79VrM{aA|+@^d1bc=qyX0|9_Df_vK24nkoHjD$FVKF&<5&;|T1 f390fE7#r|6QDD!io!|UT00000NkvXXu0mjfPEsSc literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/mekanism/textures/blocks/ctm/ReactorLogicAdapter.png b/src/main/resources/assets/mekanism/textures/blocks/ctm/ReactorLogicAdapter.png new file mode 100644 index 0000000000000000000000000000000000000000..d230f981129dafe5c79f918dbe3795653ce282a7 GIT binary patch literal 2660 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 SOt<0y0000