From 09b3a98a2a24cc4ad1a4f3642a8ddcc94097ecf7 Mon Sep 17 00:00:00 2001 From: "Aidan C. Brady" Date: Tue, 3 Dec 2013 08:42:13 -0500 Subject: [PATCH] Work on multipart --- .../client/render/RenderPartTransmitter.java | 1 + common/mekanism/common/Mekanism.java | 4 +- .../common/multipart/MultipartMekanism.java | 2 + .../common/multipart/PartTransmitter.java | 54 +++++++++-- .../common/multipart/PartUniversalCable.java | 97 +++++++++++++++++-- .../tileentity/TileEntityUniversalCable.java | 10 -- 6 files changed, 139 insertions(+), 29 deletions(-) diff --git a/common/mekanism/client/render/RenderPartTransmitter.java b/common/mekanism/client/render/RenderPartTransmitter.java index 2610c5976..f15e5533c 100644 --- a/common/mekanism/client/render/RenderPartTransmitter.java +++ b/common/mekanism/client/render/RenderPartTransmitter.java @@ -42,6 +42,7 @@ public class RenderPartTransmitter implements IIconRegister public static Icon liquidEnergyTexture; public static Icon sideTexture; public static Map typeMap = new HashMap(); + public static Map models; public static Map cableContentsModels; diff --git a/common/mekanism/common/Mekanism.java b/common/mekanism/common/Mekanism.java index 96a82bb32..a4d06db68 100644 --- a/common/mekanism/common/Mekanism.java +++ b/common/mekanism/common/Mekanism.java @@ -1115,8 +1115,6 @@ public class Mekanism GasRegistry.register(new Gas("oxygen")).registerFluid(); Mekanism.proxy.preInit(); - - new MultipartMekanism(); MinecraftForge.EVENT_BUS.register(hooks); @@ -1145,6 +1143,8 @@ public class Mekanism //Register to receive subscribed events MinecraftForge.EVENT_BUS.register(this); + new MultipartMekanism(); + //Set up VoiceServerManager if(voiceServerEnabled) { diff --git a/common/mekanism/common/multipart/MultipartMekanism.java b/common/mekanism/common/multipart/MultipartMekanism.java index 18268f729..fe658afda 100644 --- a/common/mekanism/common/multipart/MultipartMekanism.java +++ b/common/mekanism/common/multipart/MultipartMekanism.java @@ -28,5 +28,7 @@ public class MultipartMekanism implements IPartFactory { MultiPartRegistry.registerParts(this, new String[]{"mekanism:universal_cable", "mekanism:mechanical_pipe", "mekanism:pressurized_tube"}); MultipartGenerator.registerPassThroughInterface("mekanism.api.transmitters.ITransmitter"); + MultipartGenerator.registerPassThroughInterface("cofh.api.energy.IEnergyHandler"); + MultipartGenerator.registerPassThroughInterface("ic2.api.energy.tile.IEnergySink"); } } diff --git a/common/mekanism/common/multipart/PartTransmitter.java b/common/mekanism/common/multipart/PartTransmitter.java index 64bc2a088..75e6c64b1 100644 --- a/common/mekanism/common/multipart/PartTransmitter.java +++ b/common/mekanism/common/multipart/PartTransmitter.java @@ -1,5 +1,7 @@ package mekanism.common.multipart; +import ic2.api.energy.event.EnergyTileUnloadEvent; + import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -13,10 +15,12 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; import net.minecraft.util.MovingObjectPosition; import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.common.MinecraftForge; import mekanism.api.Object3D; import mekanism.api.transmitters.DynamicNetwork; import mekanism.api.transmitters.ITransmitter; import mekanism.api.transmitters.TransmissionType; +import mekanism.api.transmitters.TransmitterNetworkRegistry; import mekanism.client.render.RenderPartTransmitter; import mekanism.common.Mekanism; import mekanism.common.item.ItemConfigurator; @@ -35,12 +39,13 @@ import codechicken.multipart.PartMap; import codechicken.multipart.TMultiPart; import codechicken.multipart.TSlottedPart; import codechicken.multipart.TileMultipart; +import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; - public abstract class PartTransmitter, D> extends TMultiPart implements TSlottedPart, JNormalOcclusion, IHollowConnect, JIconHitEffects, ITransmitter { + public int delayTicks; public N theNetwork; public D transmitting; public static IndexedCuboid6[] sides = new IndexedCuboid6[7]; @@ -80,9 +85,9 @@ public abstract class PartTransmitter, D> exte { if (tile() != null && theNetwork != null) { - this.getTransmitterNetwork().transmitters.remove(tile()); + getTransmitterNetwork().transmitters.remove(tile()); super.bind(t); - this.getTransmitterNetwork().transmitters.add((ITransmitter) tile()); + getTransmitterNetwork().transmitters.add((ITransmitter) tile()); } else { @@ -151,7 +156,7 @@ public abstract class PartTransmitter, D> exte byte or = (byte)(possibleTransmitters | currentTransmitterConnections); if(or != possibleTransmitters) { - ((DynamicNetwork)getTransmitterNetwork()).split((ITransmitter)tile()); + ((DynamicNetwork)getTransmitterNetwork()).split((ITransmitter)tile()); setTransmitterNetwork(null); } @@ -196,7 +201,7 @@ public abstract class PartTransmitter, D> exte { int ord = side.ordinal(); byte connections = getAllCurrentConnections(); - if(connectionMapContainsSide(connections, side) || side == this.testingSide) subParts.add(sides[ord]); + if(connectionMapContainsSide(connections, side) || side == testingSide) subParts.add(sides[ord]); } } subParts.add(sides[6]); @@ -375,6 +380,20 @@ public abstract class PartTransmitter, D> exte isActive = packet.readBoolean(); } + @Override + public void onChunkUnload() + { + super.onChunkUnload(); + + getTransmitterNetwork().split(this); + + if(!world().isRemote) + { + TransmitterNetworkRegistry.getInstance().pruneEmptyNetworks(); + } + } + + @Override public void writeDesc(MCDataOutput packet) { packet.writeByte(currentTransmitterConnections); @@ -413,18 +432,37 @@ public abstract class PartTransmitter, D> exte @Override public void preRemove() { - if (!this.world().isRemote && tile() instanceof ITransmitter) + if(!world().isRemote && tile() instanceof ITransmitter) { - this.getTransmitterNetwork().split((ITransmitter)tile()); + getTransmitterNetwork().split((ITransmitter)tile()); + + TransmitterNetworkRegistry.getInstance().pruneEmptyNetworks(); } super.preRemove(); } + + @Override + public void update() + { + if(world().isRemote) + { + if(delayTicks == 3) + { + delayTicks++; + refreshTransmitterNetwork(); + } + else if(delayTicks < 3) + { + delayTicks++; + } + } + } @Override public boolean doesTick() { - return true; + return FMLCommonHandler.instance().getEffectiveSide().isClient(); } @Override diff --git a/common/mekanism/common/multipart/PartUniversalCable.java b/common/mekanism/common/multipart/PartUniversalCable.java index 33e26fce5..f9c4c0df8 100644 --- a/common/mekanism/common/multipart/PartUniversalCable.java +++ b/common/mekanism/common/multipart/PartUniversalCable.java @@ -1,18 +1,16 @@ package mekanism.common.multipart; +import ic2.api.energy.event.EnergyTileLoadEvent; +import ic2.api.energy.event.EnergyTileUnloadEvent; import ic2.api.energy.tile.IEnergyAcceptor; +import ic2.api.energy.tile.IEnergySink; import ic2.api.energy.tile.IEnergySource; +import ic2.api.energy.tile.IEnergyTile; +import java.util.ArrayList; import java.util.Set; -import codechicken.lib.vec.Vector3; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import universalelectricity.core.block.IElectrical; -import buildcraft.api.power.IPowerEmitter; -import buildcraft.api.power.IPowerReceptor; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.ForgeDirection; +import mekanism.api.Object3D; import mekanism.api.energy.ICableOutputter; import mekanism.api.energy.IStrictEnergyAcceptor; import mekanism.api.transmitters.ITransmitter; @@ -20,8 +18,17 @@ import mekanism.api.transmitters.TransmissionType; import mekanism.client.render.RenderPartTransmitter; import mekanism.common.EnergyNetwork; import mekanism.common.Mekanism; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.common.MinecraftForge; +import universalelectricity.core.block.IElectrical; +import buildcraft.api.power.IPowerEmitter; +import buildcraft.api.power.IPowerReceptor; +import codechicken.lib.vec.Vector3; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; -public class PartUniversalCable extends PartTransmitter +public class PartUniversalCable extends PartTransmitter implements IEnergySink { public Double setLevel = 0.0; private int ticks; @@ -109,6 +116,7 @@ public class PartUniversalCable extends PartTransmitter { if(world().isRemote) { + System.out.println("print"); if(transmitting != setLevel) { transmitting = (transmitting *4.0 + setLevel)/5.0; @@ -117,10 +125,55 @@ public class PartUniversalCable extends PartTransmitter } } } + + public void register() + { + if(!world().isRemote) + { + if(!Mekanism.ic2Registered.contains(Object3D.get(tile()))) + { + Mekanism.ic2Registered.add(Object3D.get(tile())); + MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent((IEnergyTile)tile())); + } + } + } @Override public void chunkLoad() { + register(); + } + + @Override + public void preRemove() + { + if(!world().isRemote) + { + Mekanism.ic2Registered.remove(Object3D.get(tile())); + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent((IEnergyTile)tile())); + } + + super.preRemove(); + } + + @Override + public void onAdded() + { + super.onAdded(); + + register(); + } + + @Override + public void onChunkUnload() + { + super.onChunkUnload(); + + if(!world().isRemote) + { + Mekanism.ic2Registered.remove(Object3D.get(tile())); + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent((IEnergyTile)tile())); + } } @Override @@ -146,4 +199,30 @@ public class PartUniversalCable extends PartTransmitter { return getTransmitterNetwork().getFlow(); } + + @Override + public boolean acceptsEnergyFrom(TileEntity emitter, ForgeDirection direction) + { + return true; + } + + @Override + public double demandedEnergyUnits() + { + return getTransmitterNetwork().getEnergyNeeded(new ArrayList())*Mekanism.TO_IC2; + } + + @Override + public int getMaxSafeInput() + { + return Integer.MAX_VALUE; + } + + @Override + public double injectEnergyUnits(ForgeDirection direction, double i) + { + ArrayList list = new ArrayList(); + list.add(Object3D.get(tile()).getFromSide(direction).getTileEntity(world())); + return getTransmitterNetwork().emit(i*Mekanism.FROM_IC2, list)*Mekanism.TO_IC2; + } } diff --git a/common/mekanism/common/tileentity/TileEntityUniversalCable.java b/common/mekanism/common/tileentity/TileEntityUniversalCable.java index 11b732882..12c20d63c 100644 --- a/common/mekanism/common/tileentity/TileEntityUniversalCable.java +++ b/common/mekanism/common/tileentity/TileEntityUniversalCable.java @@ -147,16 +147,6 @@ public class TileEntityUniversalCable extends TileEntityTransmitter