Even more modularization

This commit is contained in:
Aidan Brady 2013-08-18 16:51:47 -04:00
parent b2f20185e4
commit f64ea42e43
14 changed files with 176 additions and 340 deletions

View file

@ -13,7 +13,7 @@ import mekanism.common.EnergyNetwork;
import mekanism.common.IMechanicalPipe; import mekanism.common.IMechanicalPipe;
import mekanism.common.IUniversalCable; import mekanism.common.IUniversalCable;
public abstract class DynamicNetwork<T, A> implements ITransmitterNetwork public abstract class DynamicNetwork<T, A, N> implements ITransmitterNetwork<T, A, N>
{ {
public HashSet<T> transmitters = new HashSet<T>(); public HashSet<T> transmitters = new HashSet<T>();
@ -30,6 +30,7 @@ public abstract class DynamicNetwork<T, A> implements ITransmitterNetwork
transmitters.addAll(newTransmitters); transmitters.addAll(newTransmitters);
} }
@Override
public void removeTransmitter(T transmitter) public void removeTransmitter(T transmitter)
{ {
transmitters.remove(transmitter); transmitters.remove(transmitter);
@ -40,6 +41,7 @@ public abstract class DynamicNetwork<T, A> implements ITransmitterNetwork
} }
} }
@Override
public void register() public void register()
{ {
try { try {
@ -52,6 +54,7 @@ public abstract class DynamicNetwork<T, A> implements ITransmitterNetwork
} catch(NoSuchElementException e) {} } catch(NoSuchElementException e) {}
} }
@Override
public void deregister() public void deregister()
{ {
transmitters.clear(); transmitters.clear();
@ -63,4 +66,19 @@ public abstract class DynamicNetwork<T, A> implements ITransmitterNetwork
{ {
return transmitters.size(); return transmitters.size();
} }
@Override
public void tick()
{
if(!fixed)
{
++ticksSinceCreate;
if(ticksSinceCreate > 1200)
{
ticksSinceCreate = 0;
fixMessedUpNetwork(transmitters.iterator().next());
}
}
}
} }

View file

@ -20,7 +20,7 @@ import net.minecraftforge.event.ForgeSubscribe;
import net.minecraftforge.event.world.ChunkEvent; import net.minecraftforge.event.world.ChunkEvent;
import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.FMLCommonHandler;
public class GasNetwork extends DynamicNetwork<IPressurizedTube, IGasAcceptor> public class GasNetwork extends DynamicNetwork<IPressurizedTube, IGasAcceptor, GasNetwork>
{ {
public GasNetwork(IPressurizedTube... varPipes) public GasNetwork(IPressurizedTube... varPipes)
{ {
@ -45,7 +45,7 @@ public class GasNetwork extends DynamicNetwork<IPressurizedTube, IGasAcceptor>
public int emit(int gasToSend, EnumGas transferType, TileEntity emitter) public int emit(int gasToSend, EnumGas transferType, TileEntity emitter)
{ {
List availableAcceptors = Arrays.asList(getGasAcceptors(transferType).toArray()); List availableAcceptors = Arrays.asList(getAcceptors(transferType).toArray());
Collections.shuffle(availableAcceptors); Collections.shuffle(availableAcceptors);
@ -84,8 +84,10 @@ public class GasNetwork extends DynamicNetwork<IPressurizedTube, IGasAcceptor>
return gasToSend; return gasToSend;
} }
public Set<IGasAcceptor> getGasAcceptors(EnumGas transferType) @Override
public Set<IGasAcceptor> getAcceptors(Object... data)
{ {
EnumGas transferType = (EnumGas)data[0];
Set<IGasAcceptor> toReturn = new HashSet<IGasAcceptor>(); Set<IGasAcceptor> toReturn = new HashSet<IGasAcceptor>();
for(IGasAcceptor acceptor : possibleAcceptors) for(IGasAcceptor acceptor : possibleAcceptors)
@ -102,6 +104,7 @@ public class GasNetwork extends DynamicNetwork<IPressurizedTube, IGasAcceptor>
return toReturn; return toReturn;
} }
@Override
public void refresh() public void refresh()
{ {
Set<IPressurizedTube> iterTubes = (Set<IPressurizedTube>) transmitters.clone(); Set<IPressurizedTube> iterTubes = (Set<IPressurizedTube>) transmitters.clone();
@ -139,6 +142,7 @@ public class GasNetwork extends DynamicNetwork<IPressurizedTube, IGasAcceptor>
} }
} }
@Override
public void merge(GasNetwork network) public void merge(GasNetwork network)
{ {
if(network != null && network != this) if(network != null && network != this)
@ -151,6 +155,7 @@ public class GasNetwork extends DynamicNetwork<IPressurizedTube, IGasAcceptor>
} }
} }
@Override
public void split(IPressurizedTube splitPoint) public void split(IPressurizedTube splitPoint)
{ {
if(splitPoint instanceof TileEntity) if(splitPoint instanceof TileEntity)
@ -215,6 +220,7 @@ public class GasNetwork extends DynamicNetwork<IPressurizedTube, IGasAcceptor>
} }
} }
@Override
public void fixMessedUpNetwork(IPressurizedTube tube) public void fixMessedUpNetwork(IPressurizedTube tube)
{ {
if(tube instanceof TileEntity) if(tube instanceof TileEntity)
@ -304,46 +310,9 @@ public class GasNetwork extends DynamicNetwork<IPressurizedTube, IGasAcceptor>
} }
} }
public static class NetworkLoader
{
@ForgeSubscribe
public void onChunkLoad(ChunkEvent.Load event)
{
if(event.getChunk() != null)
{
for(Object obj : event.getChunk().chunkTileEntityMap.values())
{
if(obj instanceof TileEntity)
{
TileEntity tileEntity = (TileEntity)obj;
if(tileEntity instanceof IPressurizedTube)
{
((IPressurizedTube)tileEntity).refreshNetwork();
}
}
}
}
}
}
@Override @Override
public String toString() public String toString()
{ {
return "[GasNetwork] " + transmitters.size() + " transmitters, " + possibleAcceptors.size() + " acceptors."; return "[GasNetwork] " + transmitters.size() + " transmitters, " + possibleAcceptors.size() + " acceptors.";
} }
public void tick()
{
//Fix weird behaviour periodically.
if(!fixed)
{
++ticksSinceCreate;
if(ticksSinceCreate > 1200)
{
ticksSinceCreate = 0;
fixMessedUpNetwork(transmitters.iterator().next());
}
}
}
} }

View file

@ -5,7 +5,6 @@ import java.util.Set;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.common.MinecraftForge;
/** /**
* A handy class containing several utilities for efficient gas transfer. * A handy class containing several utilities for efficient gas transfer.
@ -14,23 +13,6 @@ import net.minecraftforge.common.MinecraftForge;
*/ */
public final class GasTransmission public final class GasTransmission
{ {
/** Do not mess with this, used to only register NetworkLoader once. */
private static boolean networkLoader_loaded = false;
/**
* Call this method in your mod's init phase in order for the GasNetwork to function properly.
*/
public static void register()
{
if(!networkLoader_loaded)
{
MinecraftForge.EVENT_BUS.register(new GasNetwork.NetworkLoader());
networkLoader_loaded = true;
System.out.println("[Mekanism] Successfully loaded gas transmission NetworkLoader.");
}
}
/** /**
* Gets all the tubes around a tile entity. * Gets all the tubes around a tile entity.
* @param tileEntity - center tile entity * @param tileEntity - center tile entity

View file

@ -2,7 +2,7 @@ package mekanism.api;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
public interface IPressurizedTube public interface IPressurizedTube extends ITransmitter<GasNetwork>
{ {
/** /**
* Whether or not this tube can transfer gas. * Whether or not this tube can transfer gas.
@ -22,41 +22,4 @@ public interface IPressurizedTube
* @param type - the type of gas transferred * @param type - the type of gas transferred
*/ */
public void onTransfer(EnumGas type); public void onTransfer(EnumGas type);
/**
* Gets the GasNetwork currently in use by this tube segment.
* @return GasNetwork this cable is using
*/
public GasNetwork getNetwork();
/**
* Gets the GasNetwork currently in use by this tube segment.
* @param createIfNull - If true, the tube will try and connect to an
* adjacent network, merging several if necessary, or creating a new one
* if none is available
* @return GasNetwork this cable is using
*/
public GasNetwork getNetwork(boolean createIfNull);
/**
* Sets this cable segment's GasNetwork to a new value.
* @param network - GasNetwork to set to
*/
public void setNetwork(GasNetwork network);
/**
* Refreshes the tube's GasNetwork.
*/
public void refreshNetwork();
/**
* Remove a tube from its network.
*/
public void removeFromNetwork();
/**
* Call this if you're worried a tube's network is messed up and you want
* it to try and fix itself.
*/
public void fixNetwork();
} }

View file

@ -0,0 +1,41 @@
package mekanism.api;
public interface ITransmitter<N>
{
/**
* Gets the network currently in use by this transmitter segment.
* @return network this transmitter is using
*/
public N getNetwork();
/**
* Gets the network currently in use by this transmitter segment.
* @param createIfNull - If true, the transmitter will try and connect to an
* adjacent network, merging several if necessary, or creating a new one
* if none is available
* @return network this transmitter is using
*/
public N getNetwork(boolean createIfNull);
/**
* Sets this transmitter segment's network to a new value.
* @param network - network to set to
*/
public void setNetwork(N network);
/**
* Refreshes the transmitter's network.
*/
public void refreshNetwork();
/**
* Remove this transmitter from its network.
*/
public void removeFromNetwork();
/**
* Call this if you're worried a transmitter's network is messed up and you want
* it to try and fix itself.
*/
public void fixNetwork();
}

View file

@ -1,8 +1,28 @@
package mekanism.api; package mekanism.api;
public interface ITransmitterNetwork import java.util.Set;
import mekanism.common.IUniversalCable;
public interface ITransmitterNetwork<T, A, N>
{ {
public void tick(); public void tick();
public int getSize(); public int getSize();
public Set<A> getAcceptors(Object... data);
public void removeTransmitter(T transmitter);
public void refresh();
public void split(T splitPoint);
public void merge(N network);
public void fixMessedUpNetwork(T transmitter);
public void register();
public void deregister();
} }

View file

@ -4,6 +4,10 @@ import java.util.EnumSet;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.ForgeSubscribe;
import net.minecraftforge.event.world.ChunkEvent;
import cpw.mods.fml.common.ITickHandler; import cpw.mods.fml.common.ITickHandler;
import cpw.mods.fml.common.TickType; import cpw.mods.fml.common.TickType;
import cpw.mods.fml.common.registry.TickRegistry; import cpw.mods.fml.common.registry.TickRegistry;
@ -12,6 +16,8 @@ import cpw.mods.fml.relauncher.Side;
public class TransmitterNetworkRegistry implements ITickHandler public class TransmitterNetworkRegistry implements ITickHandler
{ {
private static TransmitterNetworkRegistry INSTANCE = new TransmitterNetworkRegistry(); private static TransmitterNetworkRegistry INSTANCE = new TransmitterNetworkRegistry();
private static boolean loaderRegistered = false;
private HashSet<ITransmitterNetwork> networks = new HashSet<ITransmitterNetwork>(); private HashSet<ITransmitterNetwork> networks = new HashSet<ITransmitterNetwork>();
public TransmitterNetworkRegistry() public TransmitterNetworkRegistry()
@ -19,6 +25,16 @@ public class TransmitterNetworkRegistry implements ITickHandler
TickRegistry.registerTickHandler(this, Side.SERVER); TickRegistry.registerTickHandler(this, Side.SERVER);
} }
public static void initiate()
{
if(!loaderRegistered)
{
loaderRegistered = true;
MinecraftForge.EVENT_BUS.register(getInstance());
}
}
public static TransmitterNetworkRegistry getInstance() public static TransmitterNetworkRegistry getInstance()
{ {
return INSTANCE; return INSTANCE;
@ -85,4 +101,27 @@ public class TransmitterNetworkRegistry implements ITickHandler
{ {
return "Network Registry:\n" + networks; return "Network Registry:\n" + networks;
} }
public static class NetworkLoader
{
@ForgeSubscribe
public void onChunkLoad(ChunkEvent.Load event)
{
if(event.getChunk() != null)
{
for(Object obj : event.getChunk().chunkTileEntityMap.values())
{
if(obj instanceof TileEntity)
{
TileEntity tileEntity = (TileEntity)obj;
if(tileEntity instanceof ITransmitter)
{
((ITransmitter)tileEntity).refreshNetwork();
}
}
}
}
}
}
} }

View file

@ -32,7 +32,7 @@ import buildcraft.api.power.PowerHandler.PowerReceiver;
import buildcraft.api.power.PowerHandler.Type; import buildcraft.api.power.PowerHandler.Type;
import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.FMLCommonHandler;
public class EnergyNetwork extends DynamicNetwork<IUniversalCable, TileEntity> public class EnergyNetwork extends DynamicNetwork<IUniversalCable, TileEntity, EnergyNetwork>
{ {
private double lastPowerScale = 0; private double lastPowerScale = 0;
private double joulesTransmitted = 0; private double joulesTransmitted = 0;
@ -63,7 +63,7 @@ public class EnergyNetwork extends DynamicNetwork<IUniversalCable, TileEntity>
{ {
double totalNeeded = 0; double totalNeeded = 0;
for(TileEntity acceptor : getEnergyAcceptors()) for(TileEntity acceptor : getAcceptors())
{ {
if(!ignored.contains(acceptor)) if(!ignored.contains(acceptor))
{ {
@ -94,7 +94,7 @@ public class EnergyNetwork extends DynamicNetwork<IUniversalCable, TileEntity>
double energyAvailable = energyToSend; double energyAvailable = energyToSend;
double sent; double sent;
List availableAcceptors = Arrays.asList(getEnergyAcceptors().toArray()); List availableAcceptors = Arrays.asList(getAcceptors().toArray());
Collections.shuffle(availableAcceptors); Collections.shuffle(availableAcceptors);
@ -146,7 +146,8 @@ public class EnergyNetwork extends DynamicNetwork<IUniversalCable, TileEntity>
return energyToSend; return energyToSend;
} }
public Set<TileEntity> getEnergyAcceptors() @Override
public Set<TileEntity> getAcceptors(Object... data)
{ {
Set<TileEntity> toReturn = new HashSet<TileEntity>(); Set<TileEntity> toReturn = new HashSet<TileEntity>();
@ -197,6 +198,7 @@ public class EnergyNetwork extends DynamicNetwork<IUniversalCable, TileEntity>
return toReturn; return toReturn;
} }
@Override
public void refresh() public void refresh()
{ {
Set<IUniversalCable> iterCables = (Set<IUniversalCable>) transmitters.clone(); Set<IUniversalCable> iterCables = (Set<IUniversalCable>) transmitters.clone();
@ -242,6 +244,7 @@ public class EnergyNetwork extends DynamicNetwork<IUniversalCable, TileEntity>
} }
} }
@Override
public void merge(EnergyNetwork network) public void merge(EnergyNetwork network)
{ {
if(network != null && network != this) if(network != null && network != this)
@ -254,6 +257,7 @@ public class EnergyNetwork extends DynamicNetwork<IUniversalCable, TileEntity>
} }
} }
@Override
public void split(IUniversalCable splitPoint) public void split(IUniversalCable splitPoint)
{ {
if(splitPoint instanceof TileEntity) if(splitPoint instanceof TileEntity)
@ -318,6 +322,7 @@ public class EnergyNetwork extends DynamicNetwork<IUniversalCable, TileEntity>
} }
} }
@Override
public void fixMessedUpNetwork(IUniversalCable cable) public void fixMessedUpNetwork(IUniversalCable cable)
{ {
if(cable instanceof TileEntity) if(cable instanceof TileEntity)
@ -407,51 +412,21 @@ public class EnergyNetwork extends DynamicNetwork<IUniversalCable, TileEntity>
} }
} }
public static class NetworkLoader
{
@ForgeSubscribe
public void onChunkLoad(ChunkEvent.Load event)
{
if(event.getChunk() != null)
{
for(Object obj : event.getChunk().chunkTileEntityMap.values())
{
if(obj instanceof TileEntity)
{
TileEntity tileEntity = (TileEntity)obj;
if(tileEntity instanceof IUniversalCable)
{
((IUniversalCable)tileEntity).refreshNetwork();
}
}
}
}
}
}
@Override @Override
public String toString() public String toString()
{ {
return "[EnergyNetwork] " + transmitters.size() + " transmitters, " + possibleAcceptors.size() + " acceptors."; return "[EnergyNetwork] " + transmitters.size() + " transmitters, " + possibleAcceptors.size() + " acceptors.";
} }
@Override
public void tick() public void tick()
{ {
clearJoulesTransmitted(); clearJoulesTransmitted();
//Fix weird behaviour periodically. super.tick();
if(!fixed)
{
++ticksSinceCreate;
if(ticksSinceCreate > 1200)
{
ticksSinceCreate = 0;
fixMessedUpNetwork(transmitters.iterator().next());
}
}
double currentPowerScale = getPowerScale(); double currentPowerScale = getPowerScale();
if(currentPowerScale != lastPowerScale && FMLCommonHandler.instance().getEffectiveSide().isServer()) if(currentPowerScale != lastPowerScale && FMLCommonHandler.instance().getEffectiveSide().isServer())
{ {
lastPowerScale = currentPowerScale; lastPowerScale = currentPowerScale;

View file

@ -3,30 +3,23 @@ package mekanism.common;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set; import java.util.Set;
import mekanism.api.DynamicNetwork; import mekanism.api.DynamicNetwork;
import mekanism.api.ITransmitterNetwork;
import mekanism.api.Object3D; import mekanism.api.Object3D;
import mekanism.api.TransmitterNetworkRegistry;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.Event; import net.minecraftforge.event.Event;
import net.minecraftforge.event.ForgeSubscribe;
import net.minecraftforge.event.world.ChunkEvent;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.IFluidHandler; import net.minecraftforge.fluids.IFluidHandler;
import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.FMLCommonHandler;
public class FluidNetwork extends DynamicNetwork<IMechanicalPipe, IFluidHandler> public class FluidNetwork extends DynamicNetwork<IMechanicalPipe, IFluidHandler, FluidNetwork>
{ {
public FluidNetwork(IMechanicalPipe... varPipes) public FluidNetwork(IMechanicalPipe... varPipes)
{ {
@ -51,7 +44,7 @@ public class FluidNetwork extends DynamicNetwork<IMechanicalPipe, IFluidHandler>
public int emit(FluidStack fluidToSend, boolean doTransfer, TileEntity emitter) public int emit(FluidStack fluidToSend, boolean doTransfer, TileEntity emitter)
{ {
List availableAcceptors = Arrays.asList(getFluidAcceptors(fluidToSend).toArray()); List availableAcceptors = Arrays.asList(getAcceptors(fluidToSend).toArray());
Collections.shuffle(availableAcceptors); Collections.shuffle(availableAcceptors);
@ -91,8 +84,10 @@ public class FluidNetwork extends DynamicNetwork<IMechanicalPipe, IFluidHandler>
return fluidSent; return fluidSent;
} }
public Set<IFluidHandler> getFluidAcceptors(FluidStack fluidToSend) @Override
public Set<IFluidHandler> getAcceptors(Object... data)
{ {
FluidStack fluidToSend = (FluidStack)data[0];
Set<IFluidHandler> toReturn = new HashSet<IFluidHandler>(); Set<IFluidHandler> toReturn = new HashSet<IFluidHandler>();
for(IFluidHandler acceptor : possibleAcceptors) for(IFluidHandler acceptor : possibleAcceptors)
@ -106,6 +101,7 @@ public class FluidNetwork extends DynamicNetwork<IMechanicalPipe, IFluidHandler>
return toReturn; return toReturn;
} }
@Override
public void refresh() public void refresh()
{ {
Set<IMechanicalPipe> iterPipes = (Set<IMechanicalPipe>) transmitters.clone(); Set<IMechanicalPipe> iterPipes = (Set<IMechanicalPipe>) transmitters.clone();
@ -143,6 +139,7 @@ public class FluidNetwork extends DynamicNetwork<IMechanicalPipe, IFluidHandler>
} }
} }
@Override
public void merge(FluidNetwork network) public void merge(FluidNetwork network)
{ {
if(network != null && network != this) if(network != null && network != this)
@ -155,6 +152,7 @@ public class FluidNetwork extends DynamicNetwork<IMechanicalPipe, IFluidHandler>
} }
} }
@Override
public void split(IMechanicalPipe splitPoint) public void split(IMechanicalPipe splitPoint)
{ {
if(splitPoint instanceof TileEntity) if(splitPoint instanceof TileEntity)
@ -219,6 +217,7 @@ public class FluidNetwork extends DynamicNetwork<IMechanicalPipe, IFluidHandler>
} }
} }
@Override
public void fixMessedUpNetwork(IMechanicalPipe pipe) public void fixMessedUpNetwork(IMechanicalPipe pipe)
{ {
if(pipe instanceof TileEntity) if(pipe instanceof TileEntity)
@ -308,43 +307,6 @@ public class FluidNetwork extends DynamicNetwork<IMechanicalPipe, IFluidHandler>
} }
} }
public static class NetworkLoader
{
@ForgeSubscribe
public void onChunkLoad(ChunkEvent.Load event)
{
if(event.getChunk() != null)
{
for(Object obj : event.getChunk().chunkTileEntityMap.values())
{
if(obj instanceof TileEntity)
{
TileEntity tileEntity = (TileEntity)obj;
if(tileEntity instanceof IMechanicalPipe)
{
((IMechanicalPipe)tileEntity).refreshNetwork();
}
}
}
}
}
}
public void tick()
{
//Fix weird behaviour periodically.
if(!fixed)
{
++ticksSinceCreate;
if(ticksSinceCreate > 1200)
{
ticksSinceCreate = 0;
fixMessedUpNetwork(transmitters.iterator().next());
}
}
}
@Override @Override
public String toString() public String toString()
{ {

View file

@ -1,41 +1,8 @@
package mekanism.common; package mekanism.common;
public interface ILogisticalTransporter import mekanism.api.ITransmitter;
public interface ILogisticalTransporter extends ITransmitter<InventoryNetwork>
{ {
/**
* Gets the InventoryNetwork currently in use by this transporter segment.
* @return InventoryNetwork this transporter is using
*/
public InventoryNetwork getNetwork();
/**
* Gets the InventoryNetwork currently in use by this transporter segment.
* @param createIfNull - If true, the transporter will try and connect to an
* adjacent network, merging several if necessary, or creating a new one
* if none is available
* @return InventoryNetwork this transporter is using
*/
public InventoryNetwork getNetwork(boolean createIfNull);
/**
* Sets this transporter segment's InventoryNetwork to a new value.
* @param network - InventoryNetwork to set to
*/
public void setNetwork(InventoryNetwork network);
/**
* Refreshes the transporter's InventoryNetwork.
*/
public void refreshNetwork();
/**
* Remove a transporter from its network.
*/
public void removeFromNetwork();
/**
* Call this if you're worried a transporter's network is messed up and you want
* it to try and fix itself.
*/
public void fixNetwork();
} }

View file

@ -1,5 +1,6 @@
package mekanism.common; package mekanism.common;
import mekanism.api.ITransmitter;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
/** /**
@ -7,48 +8,11 @@ import net.minecraftforge.fluids.FluidStack;
* @author AidanBrady * @author AidanBrady
* *
*/ */
public interface IMechanicalPipe public interface IMechanicalPipe extends ITransmitter<FluidNetwork>
{ {
/** /**
* Called when fluid is transferred through this pipe. * Called when fluid is transferred through this pipe.
* @param fluidStack - the fluid transferred * @param fluidStack - the fluid transferred
*/ */
public void onTransfer(FluidStack fluidStack); public void onTransfer(FluidStack fluidStack);
/**
* Gets the FluidNetwork currently in use by this pipe segment.
* @return FluidNetwork this pipe is using
*/
public FluidNetwork getNetwork();
/**
* Gets the FluidNetwork currently in use by this pipe segment.
* @param createIfNull - If true, the pipe will try and connect to an
* adjacent network, merging several if necessary, or creating a new one
* if none is available
* @return FluidNetwork this pipe is using
*/
public FluidNetwork getNetwork(boolean createIfNull);
/**
* Sets this pipe segment's FluidNetwork to a new value.
* @param network - FluidNetwork to set to
*/
public void setNetwork(FluidNetwork network);
/**
* Refreshes the pipe's FluidNetwork.
*/
public void refreshNetwork();
/**
* Remove a pipe from its network.
*/
public void removeFromNetwork();
/**
* Call this if you're worried a pipe's network is messed up and you want
* it to try and fix itself.
*/
public void fixNetwork();
} }

View file

@ -1,50 +1,14 @@
package mekanism.common; package mekanism.common;
import mekanism.api.ITransmitter;
/** /**
* Implement this in your TileEntity class if the block can transfer energy as a Universal Cable. * Implement this in your TileEntity class if the block can transfer energy as a Universal Cable.
* @author AidanBrady * @author AidanBrady
* *
*/ */
public interface IUniversalCable public interface IUniversalCable extends ITransmitter<EnergyNetwork>
{ {
/**
* Gets the EnergyNetwork currently in use by this cable segment.
* Will try to connect to adjacent networks or create a new one
* @return EnergyNetwork this cable is using
*/
public EnergyNetwork getNetwork();
/**
* Gets the EnergyNetwork currently in use by this cable segment.
* @param createIfNull - If true, the cable will try and connect to an
* adjacent network, merging several if necessary, or creating a new one
* if none is available
* @return EnergyNetwork this cable is using
*/
public EnergyNetwork getNetwork(boolean createIfNull);
/**
* Sets this cable segment's EnergyNetwork to a new value.
* @param network - EnergyNetwork to set to
*/
public void setNetwork(EnergyNetwork network);
/**
* Refreshes the cable's EnergyNetwork.
*/
public void refreshNetwork();
/**
* Remove a cable from its network.
*/
public void removeFromNetwork();
/**
* Call this if you're worried a cable's network is messed up and you want
* it to try and fix itself.
*/
public void fixNetwork();
/** /**
* Sets a Universal Cable's energy scale to a new value. * Sets a Universal Cable's energy scale to a new value.
* @param energyScale - energy scale to set * @param energyScale - energy scale to set

View file

@ -21,7 +21,7 @@ import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.event.ForgeSubscribe; import net.minecraftforge.event.ForgeSubscribe;
import net.minecraftforge.event.world.ChunkEvent; import net.minecraftforge.event.world.ChunkEvent;
public class InventoryNetwork extends DynamicNetwork<ILogisticalTransporter, IInventory> public class InventoryNetwork extends DynamicNetwork<ILogisticalTransporter, IInventory, InventoryNetwork>
{ {
public InventoryNetwork(ILogisticalTransporter... varTransporters) public InventoryNetwork(ILogisticalTransporter... varTransporters)
{ {
@ -44,6 +44,13 @@ public class InventoryNetwork extends DynamicNetwork<ILogisticalTransporter, IIn
register(); register();
} }
@Override
public Set<IInventory> getAcceptors(Object... data)
{
return null;
}
@Override
public void refresh() public void refresh()
{ {
Set<ILogisticalTransporter> iterPipes = (Set<ILogisticalTransporter>)transmitters.clone(); Set<ILogisticalTransporter> iterPipes = (Set<ILogisticalTransporter>)transmitters.clone();
@ -81,6 +88,7 @@ public class InventoryNetwork extends DynamicNetwork<ILogisticalTransporter, IIn
} }
} }
@Override
public void merge(InventoryNetwork network) public void merge(InventoryNetwork network)
{ {
if(network != null && network != this) if(network != null && network != this)
@ -93,6 +101,7 @@ public class InventoryNetwork extends DynamicNetwork<ILogisticalTransporter, IIn
} }
} }
@Override
public void split(ILogisticalTransporter splitPoint) public void split(ILogisticalTransporter splitPoint)
{ {
if(splitPoint instanceof TileEntity) if(splitPoint instanceof TileEntity)
@ -158,6 +167,7 @@ public class InventoryNetwork extends DynamicNetwork<ILogisticalTransporter, IIn
} }
} }
@Override
public void fixMessedUpNetwork(ILogisticalTransporter pipe) public void fixMessedUpNetwork(ILogisticalTransporter pipe)
{ {
if(pipe instanceof TileEntity) if(pipe instanceof TileEntity)
@ -234,43 +244,6 @@ public class InventoryNetwork extends DynamicNetwork<ILogisticalTransporter, IIn
} }
} }
public static class NetworkLoader
{
@ForgeSubscribe
public void onChunkLoad(ChunkEvent.Load event)
{
if(event.getChunk() != null)
{
for(Object obj : event.getChunk().chunkTileEntityMap.values())
{
if(obj instanceof TileEntity)
{
TileEntity tileEntity = (TileEntity)obj;
if(tileEntity instanceof ILogisticalTransporter)
{
((ILogisticalTransporter)tileEntity).refreshNetwork();
}
}
}
}
}
}
public void tick()
{
//Fix weird behaviour periodically.
if(!fixed)
{
++ticksSinceCreate;
if(ticksSinceCreate > 1200)
{
ticksSinceCreate = 0;
fixMessedUpNetwork(transmitters.iterator().next());
}
}
}
@Override @Override
public String toString() public String toString()
{ {

View file

@ -16,6 +16,7 @@ import mekanism.api.InfuseRegistry;
import mekanism.api.InfuseType; import mekanism.api.InfuseType;
import mekanism.api.InfusionInput; import mekanism.api.InfusionInput;
import mekanism.api.Object3D; import mekanism.api.Object3D;
import mekanism.api.TransmitterNetworkRegistry;
import mekanism.client.SoundHandler; import mekanism.client.SoundHandler;
import mekanism.common.EnergyNetwork.EnergyTransferEvent; import mekanism.common.EnergyNetwork.EnergyTransferEvent;
import mekanism.common.FluidNetwork.FluidTransferEvent; import mekanism.common.FluidNetwork.FluidTransferEvent;
@ -1168,11 +1169,9 @@ public class Mekanism
//Register to receive subscribed events //Register to receive subscribed events
MinecraftForge.EVENT_BUS.register(this); MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new IC2EnergyHandler()); MinecraftForge.EVENT_BUS.register(new IC2EnergyHandler());
MinecraftForge.EVENT_BUS.register(new EnergyNetwork.NetworkLoader());
MinecraftForge.EVENT_BUS.register(new FluidNetwork.NetworkLoader());
//Register with GasTransmission //Register with TransmitterNetworkRegistry
GasTransmission.register(); TransmitterNetworkRegistry.initiate();
//Load configuration //Load configuration
proxy.loadConfiguration(); proxy.loadConfiguration();