blob: 5c6d90f8d2e14d68ba8aa5113f47d91daf4bc415 [file] [log] [blame] [raw]
package mekanism.common.multipart;
import mekanism.api.Chunk3D;
import mekanism.api.Coord4D;
import mekanism.api.transmitters.DynamicNetwork;
import mekanism.api.transmitters.DynamicNetwork.NetworkClientRequest;
import mekanism.api.transmitters.ITransmitterTile;
import mekanism.api.transmitters.TransmitterNetworkRegistry;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.ForgeDirection;
import java.util.Collection;
public abstract class PartTransmitter<A, N extends DynamicNetwork<A, N>> extends PartSidedPipe implements ITransmitterTile<A, N>
{
public MultipartTransmitter<A, N> transmitterDelegate;
public PartTransmitter()
{
transmitterDelegate = new MultipartTransmitter<>(this);
}
@Override
public MultipartTransmitter<A, N> getTransmitter()
{
return transmitterDelegate;
}
@Override
public void onWorldJoin()
{
super.onWorldJoin();
if(!world().isRemote)
{
System.out.println("Reload " + new Chunk3D(Coord4D.get(tile())));
TransmitterNetworkRegistry.registerOrphanTransmitter(getTransmitter());
}
else {
MinecraftForge.EVENT_BUS.post(new NetworkClientRequest(tile()));
}
}
public abstract N createNewNetwork();
public abstract N createNetworkByMerging(Collection<N> networks);
@Override
public void onChunkUnload()
{
super.onChunkUnload();
if(!world().isRemote)
{
System.out.println("Unload " + new Chunk3D(Coord4D.get(tile())));
getTransmitter().takeShare();
TransmitterNetworkRegistry.invalidateTransmitter(getTransmitter());
}
else {
getTransmitter().setTransmitterNetwork(null);
}
}
@Override
public void preRemove()
{
if(!world().isRemote)
{
TransmitterNetworkRegistry.invalidateTransmitter(getTransmitter());
}
else {
getTransmitter().setTransmitterNetwork(null);
}
super.preRemove();
}
@Override
public void onNeighborTileChanged(int side, boolean weak)
{
super.onNeighborTileChanged(side, weak);
}
@Override
public void markDirtyTransmitters()
{
super.markDirtyTransmitters();
if(getTransmitter().hasTransmitterNetwork())
{
TransmitterNetworkRegistry.invalidateTransmitter(getTransmitter());
}
}
@Override
public void markDirtyAcceptor(ForgeDirection side)
{
super.markDirtyAcceptor(side);
if(getTransmitter().hasTransmitterNetwork())
{
getTransmitter().getTransmitterNetwork().acceptorChanged(getTransmitter(), side);
}
}
public A getCachedAcceptor(ForgeDirection side)
{
ConnectionType type = connectionTypes[side.ordinal()];
if(type == ConnectionType.PULL || type == ConnectionType.NONE)
{
return null;
}
return connectionMapContainsSide(currentAcceptorConnections, side) ? (A)cachedAcceptors[side.ordinal()] : null;
}
public abstract int getCapacity();
public abstract Object getBuffer();
public abstract void takeShare();
}