Transmitters now intelligently maintain buffers when transmitter nodes are destroyed

This commit is contained in:
aidancbrady 2015-11-26 15:41:22 -07:00
parent b248cf4b07
commit 2b785c95f3
10 changed files with 133 additions and 90 deletions

View file

@ -1,18 +1,10 @@
package mekanism.api.transmitters; 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.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.collect.Sets; 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.Coord4D;
import mekanism.api.IClientTicker; import mekanism.api.IClientTicker;
import mekanism.api.Range4D; import mekanism.api.Range4D;
@ -21,8 +13,9 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.ForgeDirection; 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<A, N extends DynamicNetwork<A, N>> implements IClientTicker, INetworkDataHandler public abstract class DynamicNetwork<A, N extends DynamicNetwork<A, N>> implements IClientTicker, INetworkDataHandler
{ {
@ -146,6 +139,28 @@ public abstract class DynamicNetwork<A, N extends DynamicNetwork<A, N>> implemen
public void invalidate() public void invalidate()
{ {
//Remove invalid transmitters first for share calculations
for(Iterator<IGridTransmitter<A, N>> iter = transmitters.iterator(); iter.hasNext();)
{
IGridTransmitter<A, N> transmitter = iter.next();
if(!transmitter.isValid())
{
iter.remove();
continue;
}
}
//Clamp the new buffer
clampBuffer();
//Update all shares
for(IGridTransmitter<A, N> transmitter : transmitters)
{
transmitter.updateShare();
}
//Now invalidate the transmitters
for(IGridTransmitter<A, N> transmitter : transmitters) for(IGridTransmitter<A, N> transmitter : transmitters)
{ {
invalidateTransmitter(transmitter); invalidateTransmitter(transmitter);

View file

@ -1,12 +1,11 @@
package mekanism.api.transmitters; package mekanism.api.transmitters;
import java.util.Collection;
import mekanism.api.Coord4D; import mekanism.api.Coord4D;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import java.util.Collection;
public interface IGridTransmitter<A, N extends DynamicNetwork<A, N>> extends ITransmitter public interface IGridTransmitter<A, N extends DynamicNetwork<A, N>> extends ITransmitter
{ {
public boolean hasTransmitterNetwork(); public boolean hasTransmitterNetwork();
@ -59,5 +58,7 @@ public interface IGridTransmitter<A, N extends DynamicNetwork<A, N>> extends ITr
public void takeShare(); public void takeShare();
public void updateShare();
public Object getBuffer(); public Object getBuffer();
} }

View file

@ -76,6 +76,7 @@ public class EnergyNetwork extends DynamicNetwork<EnergyAcceptorWrapper, EnergyN
{ {
buffer.amount = getCapacity(); buffer.amount = getCapacity();
} }
if(buffer.amount < 0) if(buffer.amount < 0)
{ {
buffer.amount = 0; buffer.amount = 0;

View file

@ -1,18 +1,17 @@
package mekanism.common.multipart; package mekanism.common.multipart;
import java.util.Collection;
import mekanism.api.Coord4D; import mekanism.api.Coord4D;
import mekanism.api.transmitters.DynamicNetwork; import mekanism.api.transmitters.DynamicNetwork;
import mekanism.api.transmitters.IGridTransmitter; import mekanism.api.transmitters.IGridTransmitter;
import mekanism.api.transmitters.ITransmitterTile; import mekanism.api.transmitters.ITransmitterTile;
import mekanism.api.transmitters.TransmissionType; import mekanism.api.transmitters.TransmissionType;
import mekanism.common.transmitters.Transmitter; import mekanism.common.transmitters.Transmitter;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import java.util.Collection;
public class MultipartTransmitter<A, N extends DynamicNetwork<A,N>> extends Transmitter<A, N> public class MultipartTransmitter<A, N extends DynamicNetwork<A,N>> extends Transmitter<A, N>
{ {
public PartTransmitter<A, N> containingPart; public PartTransmitter<A, N> containingPart;
@ -107,6 +106,12 @@ public class MultipartTransmitter<A, N extends DynamicNetwork<A,N>> extends Tran
containingPart.takeShare(); containingPart.takeShare();
} }
@Override
public void updateShare()
{
containingPart.updateShare();
}
@Override @Override
public Object getBuffer() public Object getBuffer()
{ {

View file

@ -1,28 +1,23 @@
package mekanism.common.multipart; 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.colour.ColourRGBA;
import codechicken.lib.data.MCDataInput; import codechicken.lib.data.MCDataInput;
import codechicken.lib.data.MCDataOutput; import codechicken.lib.data.MCDataOutput;
import codechicken.lib.vec.Vector3; 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<IHeatTransfer, HeatNetwork> public class PartHeatTransmitter extends PartTransmitter<IHeatTransfer, HeatNetwork>
{ {
@ -60,6 +55,9 @@ public class PartHeatTransmitter extends PartTransmitter<IHeatTransfer, HeatNetw
@Override @Override
public void takeShare() {} public void takeShare() {}
@Override
public void updateShare() {}
public static void registerIcons(IIconRegister register) public static void registerIcons(IIconRegister register)
{ {
heatIcons.registerCenterIcons(register, new String[] {"HeatTransmitter"}); heatIcons.registerCenterIcons(register, new String[] {"HeatTransmitter"});

View file

@ -1,12 +1,12 @@
package mekanism.common.multipart; package mekanism.common.multipart;
import java.util.ArrayList; import codechicken.lib.vec.Vector3;
import java.util.Collection; import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import io.netty.buffer.ByteBuf;
import mekanism.api.Coord4D; import mekanism.api.Coord4D;
import mekanism.api.EnumColor; import mekanism.api.EnumColor;
import mekanism.api.Range4D; import mekanism.api.Range4D;
import mekanism.common.base.ITransporterTile;
import mekanism.api.transmitters.TransmissionType; import mekanism.api.transmitters.TransmissionType;
import mekanism.client.render.RenderPartTransmitter; import mekanism.client.render.RenderPartTransmitter;
import mekanism.common.InventoryNetwork; import mekanism.common.InventoryNetwork;
@ -14,6 +14,7 @@ import mekanism.common.Mekanism;
import mekanism.common.Tier; import mekanism.common.Tier;
import mekanism.common.Tier.TransporterTier; import mekanism.common.Tier.TransporterTier;
import mekanism.common.base.ILogisticalTransporter; import mekanism.common.base.ILogisticalTransporter;
import mekanism.common.base.ITransporterTile;
import mekanism.common.content.transporter.InvStack; import mekanism.common.content.transporter.InvStack;
import mekanism.common.content.transporter.PathfinderCache; import mekanism.common.content.transporter.PathfinderCache;
import mekanism.common.content.transporter.TransporterManager; import mekanism.common.content.transporter.TransporterManager;
@ -34,10 +35,9 @@ import net.minecraft.util.ChatComponentText;
import net.minecraft.util.IIcon; import net.minecraft.util.IIcon;
import net.minecraftforge.common.util.Constants.NBT; import net.minecraftforge.common.util.Constants.NBT;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly; import java.util.ArrayList;
import io.netty.buffer.ByteBuf; import java.util.Collection;
import codechicken.lib.vec.Vector3;
public class PartLogisticalTransporter extends PartTransmitter<IInventory, InventoryNetwork> implements ITransporterTile public class PartLogisticalTransporter extends PartTransmitter<IInventory, InventoryNetwork> implements ITransporterTile
{ {
@ -435,6 +435,9 @@ public class PartLogisticalTransporter extends PartTransmitter<IInventory, Inven
@Override @Override
public void takeShare() {} public void takeShare() {}
@Override
public void updateShare() {}
@Override @Override
public MultipartTransporter getTransmitter() public MultipartTransporter getTransmitter()
{ {

View file

@ -42,17 +42,8 @@ public class PartMechanicalPipe extends PartTransmitter<IFluidHandler, FluidNetw
{ {
if(!world().isRemote) if(!world().isRemote)
{ {
if(getTransmitter().hasTransmitterNetwork() && getTransmitter().getTransmitterNetworkSize() > 0) updateShare();
{
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());
}
}
IFluidHandler[] connectedAcceptors = PipeUtils.getConnectedAcceptors(tile()); IFluidHandler[] connectedAcceptors = PipeUtils.getConnectedAcceptors(tile());
for(ForgeDirection side : getConnections(ConnectionType.PULL)) for(ForgeDirection side : getConnections(ConnectionType.PULL))
@ -77,6 +68,21 @@ public class PartMechanicalPipe extends PartTransmitter<IFluidHandler, FluidNetw
super.update(); super.update();
} }
@Override
public void updateShare()
{
if(getTransmitter().hasTransmitterNetwork() && getTransmitter().getTransmitterNetworkSize() > 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() private FluidStack getSaveShare()
{ {
if(getTransmitter().hasTransmitterNetwork() && getTransmitter().getTransmitterNetwork().buffer != null) if(getTransmitter().hasTransmitterNetwork() && getTransmitter().getTransmitterNetwork().buffer != null)

View file

@ -39,17 +39,8 @@ public class PartPressurizedTube extends PartTransmitter<IGasHandler, GasNetwork
public void update() public void update()
{ {
if(!world().isRemote) if(!world().isRemote)
{ {
if(getTransmitter().hasTransmitterNetwork() && getTransmitter().getTransmitterNetworkSize() > 0) updateShare();
{
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());
}
}
IGasHandler[] connectedAcceptors = GasTransmission.getConnectedAcceptors(tile()); IGasHandler[] connectedAcceptors = GasTransmission.getConnectedAcceptors(tile());
@ -84,6 +75,21 @@ public class PartPressurizedTube extends PartTransmitter<IGasHandler, GasNetwork
super.update(); super.update();
} }
@Override
public void updateShare()
{
if(getTransmitter().hasTransmitterNetwork() && getTransmitter().getTransmitterNetworkSize() > 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() private GasStack getSaveShare()
{ {
if(getTransmitter().hasTransmitterNetwork() && getTransmitter().getTransmitterNetwork().buffer != null) if(getTransmitter().hasTransmitterNetwork() && getTransmitter().getTransmitterNetwork().buffer != null)

View file

@ -122,4 +122,6 @@ public abstract class PartTransmitter<A, N extends DynamicNetwork<A, N>> extends
public abstract Object getBuffer(); public abstract Object getBuffer();
public abstract void takeShare(); public abstract void takeShare();
public abstract void updateShare();
} }

View file

@ -1,11 +1,16 @@
package mekanism.common.multipart; package mekanism.common.multipart;
import java.util.Collection; import codechicken.lib.vec.Vector3;
import java.util.List; 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.client;
import mekanism.api.MekanismConfig.general; import mekanism.api.MekanismConfig.general;
import mekanism.common.base.EnergyAcceptorWrapper;
import mekanism.api.energy.EnergyStack; import mekanism.api.energy.EnergyStack;
import mekanism.api.energy.ICableOutputter; import mekanism.api.energy.ICableOutputter;
import mekanism.api.energy.IStrictEnergyAcceptor; import mekanism.api.energy.IStrictEnergyAcceptor;
@ -14,6 +19,7 @@ import mekanism.api.transmitters.TransmissionType;
import mekanism.client.render.RenderPartTransmitter; import mekanism.client.render.RenderPartTransmitter;
import mekanism.common.EnergyNetwork; import mekanism.common.EnergyNetwork;
import mekanism.common.Tier; import mekanism.common.Tier;
import mekanism.common.base.EnergyAcceptorWrapper;
import mekanism.common.util.CableUtils; import mekanism.common.util.CableUtils;
import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils;
import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.client.renderer.texture.IIconRegister;
@ -21,15 +27,9 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon; import net.minecraft.util.IIcon;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import cpw.mods.fml.common.Optional.Interface;
import cpw.mods.fml.common.Optional.InterfaceList; import java.util.Collection;
import cpw.mods.fml.common.Optional.Method; import java.util.List;
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;
@InterfaceList({ @InterfaceList({
@Interface(iface = "cofh.api.energy.IEnergyHandler", modid = "CoFHCore"), @Interface(iface = "cofh.api.energy.IEnergyHandler", modid = "CoFHCore"),
@ -64,16 +64,7 @@ public class PartUniversalCable extends PartTransmitter<EnergyAcceptorWrapper, E
} }
} }
else { else {
if(getTransmitter().hasTransmitterNetwork() && getTransmitter().getTransmitterNetworkSize() > 0) updateShare();
{
double last = getSaveShare();
if(last != lastWrite)
{
lastWrite = last;
MekanismUtils.saveChunk(tile());
}
}
List<ForgeDirection> sides = getConnections(ConnectionType.PULL); List<ForgeDirection> sides = getConnections(ConnectionType.PULL);
@ -135,6 +126,21 @@ public class PartUniversalCable extends PartTransmitter<EnergyAcceptorWrapper, E
super.update(); super.update();
} }
@Override
public void updateShare()
{
if(getTransmitter().hasTransmitterNetwork() && getTransmitter().getTransmitterNetworkSize() > 0)
{
double last = getSaveShare();
if(last != lastWrite)
{
lastWrite = last;
MekanismUtils.saveChunk(tile());
}
}
}
private double getSaveShare() private double getSaveShare()
{ {
if(getTransmitter().hasTransmitterNetwork()) if(getTransmitter().hasTransmitterNetwork())