From 2b785c95f3e1900d07a57125065b89e83048e7ae Mon Sep 17 00:00:00 2001 From: aidancbrady Date: Thu, 26 Nov 2015 15:41:22 -0700 Subject: [PATCH] Transmitters now intelligently maintain buffers when transmitter nodes are destroyed --- .../api/transmitters/DynamicNetwork.java | 39 +++++++++----- .../api/transmitters/IGridTransmitter.java | 7 +-- .../java/mekanism/common/EnergyNetwork.java | 1 + .../multipart/MultipartTransmitter.java | 11 ++-- .../common/multipart/PartHeatTransmitter.java | 36 ++++++------- .../multipart/PartLogisticalTransporter.java | 19 ++++--- .../common/multipart/PartMechanicalPipe.java | 28 ++++++---- .../common/multipart/PartPressurizedTube.java | 28 ++++++---- .../common/multipart/PartTransmitter.java | 2 + .../common/multipart/PartUniversalCable.java | 52 +++++++++++-------- 10 files changed, 133 insertions(+), 90 deletions(-) diff --git a/src/main/java/mekanism/api/transmitters/DynamicNetwork.java b/src/main/java/mekanism/api/transmitters/DynamicNetwork.java index d0320988a..ee4e8a2b7 100644 --- a/src/main/java/mekanism/api/transmitters/DynamicNetwork.java +++ b/src/main/java/mekanism/api/transmitters/DynamicNetwork.java @@ -1,18 +1,10 @@ package mekanism.api.transmitters; -import java.util.ArrayList; -import java.util.Collection; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.Map.Entry; -import java.util.Set; - import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; - +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.eventhandler.Event; import mekanism.api.Coord4D; import mekanism.api.IClientTicker; import mekanism.api.Range4D; @@ -21,8 +13,9 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.util.ForgeDirection; -import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.eventhandler.Event; + +import java.util.*; +import java.util.Map.Entry; public abstract class DynamicNetwork> implements IClientTicker, INetworkDataHandler { @@ -146,6 +139,28 @@ public abstract class DynamicNetwork> implemen public void invalidate() { + //Remove invalid transmitters first for share calculations + for(Iterator> iter = transmitters.iterator(); iter.hasNext();) + { + IGridTransmitter transmitter = iter.next(); + + if(!transmitter.isValid()) + { + iter.remove(); + continue; + } + } + + //Clamp the new buffer + clampBuffer(); + + //Update all shares + for(IGridTransmitter transmitter : transmitters) + { + transmitter.updateShare(); + } + + //Now invalidate the transmitters for(IGridTransmitter transmitter : transmitters) { invalidateTransmitter(transmitter); diff --git a/src/main/java/mekanism/api/transmitters/IGridTransmitter.java b/src/main/java/mekanism/api/transmitters/IGridTransmitter.java index 254b4bb5d..9d82d486b 100644 --- a/src/main/java/mekanism/api/transmitters/IGridTransmitter.java +++ b/src/main/java/mekanism/api/transmitters/IGridTransmitter.java @@ -1,12 +1,11 @@ package mekanism.api.transmitters; -import java.util.Collection; - import mekanism.api.Coord4D; - import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import java.util.Collection; + public interface IGridTransmitter> extends ITransmitter { public boolean hasTransmitterNetwork(); @@ -59,5 +58,7 @@ public interface IGridTransmitter> extends ITr public void takeShare(); + public void updateShare(); + public Object getBuffer(); } diff --git a/src/main/java/mekanism/common/EnergyNetwork.java b/src/main/java/mekanism/common/EnergyNetwork.java index 9eeb2ff22..c2c9918ca 100644 --- a/src/main/java/mekanism/common/EnergyNetwork.java +++ b/src/main/java/mekanism/common/EnergyNetwork.java @@ -76,6 +76,7 @@ public class EnergyNetwork extends DynamicNetwork> extends Transmitter { public PartTransmitter containingPart; @@ -107,6 +106,12 @@ public class MultipartTransmitter> extends Tran containingPart.takeShare(); } + @Override + public void updateShare() + { + containingPart.updateShare(); + } + @Override public Object getBuffer() { diff --git a/src/main/java/mekanism/common/multipart/PartHeatTransmitter.java b/src/main/java/mekanism/common/multipart/PartHeatTransmitter.java index 8333d7cd3..8ca7678ff 100644 --- a/src/main/java/mekanism/common/multipart/PartHeatTransmitter.java +++ b/src/main/java/mekanism/common/multipart/PartHeatTransmitter.java @@ -1,28 +1,23 @@ package mekanism.common.multipart; -import java.util.Collection; - -import mekanism.api.Coord4D; -import mekanism.api.IHeatTransfer; -import mekanism.api.transmitters.TransmissionType; -import mekanism.client.render.RenderPartTransmitter; -import mekanism.common.HeatNetwork; -import mekanism.common.util.HeatUtils; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; - -import net.minecraftforge.common.util.ForgeDirection; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - import codechicken.lib.colour.ColourRGBA; import codechicken.lib.data.MCDataInput; import codechicken.lib.data.MCDataOutput; import codechicken.lib.vec.Vector3; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import mekanism.api.IHeatTransfer; +import mekanism.api.transmitters.TransmissionType; +import mekanism.client.render.RenderPartTransmitter; +import mekanism.common.HeatNetwork; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.Collection; public class PartHeatTransmitter extends PartTransmitter { @@ -60,6 +55,9 @@ public class PartHeatTransmitter extends PartTransmitter implements ITransporterTile { @@ -435,6 +435,9 @@ public class PartLogisticalTransporter extends PartTransmitter 0) - { - FluidStack last = getSaveShare(); - - if((last != null && !(lastWrite != null && lastWrite.amount == last.amount && lastWrite.getFluid() == last.getFluid())) || (last == null && lastWrite != null)) - { - lastWrite = last; - MekanismUtils.saveChunk(tile()); - } - } - + updateShare(); + IFluidHandler[] connectedAcceptors = PipeUtils.getConnectedAcceptors(tile()); for(ForgeDirection side : getConnections(ConnectionType.PULL)) @@ -77,6 +68,21 @@ public class PartMechanicalPipe extends PartTransmitter 0) + { + FluidStack last = getSaveShare(); + + if((last != null && !(lastWrite != null && lastWrite.amount == last.amount && lastWrite.getFluid() == last.getFluid())) || (last == null && lastWrite != null)) + { + lastWrite = last; + MekanismUtils.saveChunk(tile()); + } + } + } + private FluidStack getSaveShare() { if(getTransmitter().hasTransmitterNetwork() && getTransmitter().getTransmitterNetwork().buffer != null) diff --git a/src/main/java/mekanism/common/multipart/PartPressurizedTube.java b/src/main/java/mekanism/common/multipart/PartPressurizedTube.java index a493f23c1..80237cd0d 100644 --- a/src/main/java/mekanism/common/multipart/PartPressurizedTube.java +++ b/src/main/java/mekanism/common/multipart/PartPressurizedTube.java @@ -39,17 +39,8 @@ public class PartPressurizedTube extends PartTransmitter 0) - { - GasStack last = getSaveShare(); - - if((last != null && !(lastWrite != null && lastWrite.amount == last.amount && lastWrite.getGas() == last.getGas())) || (last == null && lastWrite != null)) - { - lastWrite = last; - MekanismUtils.saveChunk(tile()); - } - } + { + updateShare(); IGasHandler[] connectedAcceptors = GasTransmission.getConnectedAcceptors(tile()); @@ -84,6 +75,21 @@ public class PartPressurizedTube extends PartTransmitter 0) + { + GasStack last = getSaveShare(); + + if((last != null && !(lastWrite != null && lastWrite.amount == last.amount && lastWrite.getGas() == last.getGas())) || (last == null && lastWrite != null)) + { + lastWrite = last; + MekanismUtils.saveChunk(tile()); + } + } + } + private GasStack getSaveShare() { if(getTransmitter().hasTransmitterNetwork() && getTransmitter().getTransmitterNetwork().buffer != null) diff --git a/src/main/java/mekanism/common/multipart/PartTransmitter.java b/src/main/java/mekanism/common/multipart/PartTransmitter.java index 5772a1375..f9d75c7c6 100644 --- a/src/main/java/mekanism/common/multipart/PartTransmitter.java +++ b/src/main/java/mekanism/common/multipart/PartTransmitter.java @@ -122,4 +122,6 @@ public abstract class PartTransmitter> extends public abstract Object getBuffer(); public abstract void takeShare(); + + public abstract void updateShare(); } diff --git a/src/main/java/mekanism/common/multipart/PartUniversalCable.java b/src/main/java/mekanism/common/multipart/PartUniversalCable.java index 749828eea..7d49be3ef 100644 --- a/src/main/java/mekanism/common/multipart/PartUniversalCable.java +++ b/src/main/java/mekanism/common/multipart/PartUniversalCable.java @@ -1,11 +1,16 @@ package mekanism.common.multipart; -import java.util.Collection; -import java.util.List; - +import codechicken.lib.vec.Vector3; +import cofh.api.energy.IEnergyHandler; +import cofh.api.energy.IEnergyProvider; +import cpw.mods.fml.common.Optional.Interface; +import cpw.mods.fml.common.Optional.InterfaceList; +import cpw.mods.fml.common.Optional.Method; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ic2.api.energy.tile.IEnergySource; import mekanism.api.MekanismConfig.client; import mekanism.api.MekanismConfig.general; -import mekanism.common.base.EnergyAcceptorWrapper; import mekanism.api.energy.EnergyStack; import mekanism.api.energy.ICableOutputter; import mekanism.api.energy.IStrictEnergyAcceptor; @@ -14,6 +19,7 @@ import mekanism.api.transmitters.TransmissionType; import mekanism.client.render.RenderPartTransmitter; import mekanism.common.EnergyNetwork; import mekanism.common.Tier; +import mekanism.common.base.EnergyAcceptorWrapper; import mekanism.common.util.CableUtils; import mekanism.common.util.MekanismUtils; import net.minecraft.client.renderer.texture.IIconRegister; @@ -21,15 +27,9 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraftforge.common.util.ForgeDirection; -import cpw.mods.fml.common.Optional.Interface; -import cpw.mods.fml.common.Optional.InterfaceList; -import cpw.mods.fml.common.Optional.Method; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import codechicken.lib.vec.Vector3; -import cofh.api.energy.IEnergyHandler; -import cofh.api.energy.IEnergyProvider; -import ic2.api.energy.tile.IEnergySource; + +import java.util.Collection; +import java.util.List; @InterfaceList({ @Interface(iface = "cofh.api.energy.IEnergyHandler", modid = "CoFHCore"), @@ -64,16 +64,7 @@ public class PartUniversalCable extends PartTransmitter 0) - { - double last = getSaveShare(); - - if(last != lastWrite) - { - lastWrite = last; - MekanismUtils.saveChunk(tile()); - } - } + updateShare(); List sides = getConnections(ConnectionType.PULL); @@ -135,6 +126,21 @@ public class PartUniversalCable extends PartTransmitter 0) + { + double last = getSaveShare(); + + if(last != lastWrite) + { + lastWrite = last; + MekanismUtils.saveChunk(tile()); + } + } + } + private double getSaveShare() { if(getTransmitter().hasTransmitterNetwork())