Created a new prefab TileEntityMultiblock class and merged all Dynamic Tank multiblock-specific code into it.
Should make it much easier to create the new Steam Boiler and Steam Turbine!
This commit is contained in:
parent
55e70d5f5c
commit
8cae029ed7
8 changed files with 300 additions and 205 deletions
|
@ -138,6 +138,7 @@ import mekanism.common.tile.TileEntityLaser;
|
||||||
import mekanism.common.tile.TileEntityLaserAmplifier;
|
import mekanism.common.tile.TileEntityLaserAmplifier;
|
||||||
import mekanism.common.tile.TileEntityLogisticalSorter;
|
import mekanism.common.tile.TileEntityLogisticalSorter;
|
||||||
import mekanism.common.tile.TileEntityMetallurgicInfuser;
|
import mekanism.common.tile.TileEntityMetallurgicInfuser;
|
||||||
|
import mekanism.common.tile.TileEntityMultiblock;
|
||||||
import mekanism.common.tile.TileEntityObsidianTNT;
|
import mekanism.common.tile.TileEntityObsidianTNT;
|
||||||
import mekanism.common.tile.TileEntityOsmiumCompressor;
|
import mekanism.common.tile.TileEntityOsmiumCompressor;
|
||||||
import mekanism.common.tile.TileEntityPRC;
|
import mekanism.common.tile.TileEntityPRC;
|
||||||
|
@ -157,7 +158,6 @@ import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.client.MinecraftForgeClient;
|
import net.minecraftforge.client.MinecraftForgeClient;
|
||||||
import net.minecraftforge.common.config.Configuration;
|
|
||||||
import net.minecraftforge.common.util.ForgeDirection;
|
import net.minecraftforge.common.util.ForgeDirection;
|
||||||
import cpw.mods.fml.client.FMLClientHandler;
|
import cpw.mods.fml.client.FMLClientHandler;
|
||||||
import cpw.mods.fml.client.registry.ClientRegistry;
|
import cpw.mods.fml.client.registry.ClientRegistry;
|
||||||
|
@ -491,7 +491,7 @@ public class ClientProxy extends CommonProxy
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void doTankAnimation(TileEntityDynamicTank tileEntity)
|
public void doTankAnimation(TileEntityMultiblock<?> tileEntity)
|
||||||
{
|
{
|
||||||
new ThreadTankSparkle(tileEntity).start();
|
new ThreadTankSparkle(tileEntity).start();
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ import java.util.Set;
|
||||||
|
|
||||||
import mekanism.api.Coord4D;
|
import mekanism.api.Coord4D;
|
||||||
import mekanism.api.MekanismConfig.general;
|
import mekanism.api.MekanismConfig.general;
|
||||||
import mekanism.common.tile.TileEntityDynamicTank;
|
import mekanism.common.tile.TileEntityMultiblock;
|
||||||
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;
|
||||||
|
@ -16,13 +16,13 @@ import cpw.mods.fml.relauncher.SideOnly;
|
||||||
@SideOnly(Side.CLIENT)
|
@SideOnly(Side.CLIENT)
|
||||||
public class ThreadTankSparkle extends Thread
|
public class ThreadTankSparkle extends Thread
|
||||||
{
|
{
|
||||||
public TileEntityDynamicTank pointer;
|
public TileEntityMultiblock<?> pointer;
|
||||||
|
|
||||||
public Random random = new Random();
|
public Random random = new Random();
|
||||||
|
|
||||||
public Set<TileEntity> iteratedNodes = new HashSet<TileEntity>();
|
public Set<TileEntity> iteratedNodes = new HashSet<TileEntity>();
|
||||||
|
|
||||||
public ThreadTankSparkle(TileEntityDynamicTank tileEntity)
|
public ThreadTankSparkle(TileEntityMultiblock<?> tileEntity)
|
||||||
{
|
{
|
||||||
pointer = tileEntity;
|
pointer = tileEntity;
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,7 @@ public class ThreadTankSparkle extends Thread
|
||||||
} catch(Exception e) {}
|
} catch(Exception e) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loop(TileEntityDynamicTank tileEntity)
|
public void loop(TileEntityMultiblock<?> tileEntity)
|
||||||
{
|
{
|
||||||
World world = pointer.getWorldObj();
|
World world = pointer.getWorldObj();
|
||||||
|
|
||||||
|
@ -83,9 +83,9 @@ public class ThreadTankSparkle extends Thread
|
||||||
{
|
{
|
||||||
TileEntity tile = Coord4D.get(tileEntity).getFromSide(side).getTileEntity(pointer.getWorldObj());
|
TileEntity tile = Coord4D.get(tileEntity).getFromSide(side).getTileEntity(pointer.getWorldObj());
|
||||||
|
|
||||||
if(tile instanceof TileEntityDynamicTank && !iteratedNodes.contains(tile))
|
if(tile instanceof TileEntityMultiblock && tile.getClass() == pointer.getClass() && !iteratedNodes.contains(tile))
|
||||||
{
|
{
|
||||||
loop((TileEntityDynamicTank)tile);
|
loop((TileEntityMultiblock<?>)tile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,6 +73,7 @@ import mekanism.common.tile.TileEntityLaser;
|
||||||
import mekanism.common.tile.TileEntityLaserAmplifier;
|
import mekanism.common.tile.TileEntityLaserAmplifier;
|
||||||
import mekanism.common.tile.TileEntityLogisticalSorter;
|
import mekanism.common.tile.TileEntityLogisticalSorter;
|
||||||
import mekanism.common.tile.TileEntityMetallurgicInfuser;
|
import mekanism.common.tile.TileEntityMetallurgicInfuser;
|
||||||
|
import mekanism.common.tile.TileEntityMultiblock;
|
||||||
import mekanism.common.tile.TileEntityObsidianTNT;
|
import mekanism.common.tile.TileEntityObsidianTNT;
|
||||||
import mekanism.common.tile.TileEntityOsmiumCompressor;
|
import mekanism.common.tile.TileEntityOsmiumCompressor;
|
||||||
import mekanism.common.tile.TileEntityPRC;
|
import mekanism.common.tile.TileEntityPRC;
|
||||||
|
@ -312,7 +313,7 @@ public class CommonProxy
|
||||||
/**
|
/**
|
||||||
* Does the Dynamic Tank creation animation, starting from the rendering block.
|
* Does the Dynamic Tank creation animation, starting from the rendering block.
|
||||||
*/
|
*/
|
||||||
public void doTankAnimation(TileEntityDynamicTank tileEntity) {}
|
public void doTankAnimation(TileEntityMultiblock<?> tileEntity) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the actual interface for a GUI. Client-only.
|
* Get the actual interface for a GUI. Client-only.
|
||||||
|
|
|
@ -10,5 +10,11 @@ public class SynchronizedMatrixData extends SynchronizedData<SynchronizedTankDat
|
||||||
|
|
||||||
public double electricityStored;
|
public double electricityStored;
|
||||||
|
|
||||||
|
public double heat;
|
||||||
|
|
||||||
public int capacitors;
|
public int capacitors;
|
||||||
}
|
|
||||||
|
public int outputters;
|
||||||
|
|
||||||
|
public int coolants;
|
||||||
|
}
|
|
@ -18,13 +18,13 @@ public class SynchronizedTankData extends SynchronizedData<SynchronizedTankData>
|
||||||
|
|
||||||
public ItemStack[] inventory = new ItemStack[2];
|
public ItemStack[] inventory = new ItemStack[2];
|
||||||
|
|
||||||
public boolean didTick;
|
|
||||||
|
|
||||||
public boolean hasRenderer;
|
|
||||||
|
|
||||||
public Coord4D renderLocation;
|
|
||||||
|
|
||||||
public Set<ValveData> valves = new HashSet<ValveData>();
|
public Set<ValveData> valves = new HashSet<ValveData>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack[] getInventory()
|
||||||
|
{
|
||||||
|
return inventory;
|
||||||
|
}
|
||||||
|
|
||||||
public static class ValveData
|
public static class ValveData
|
||||||
{
|
{
|
||||||
|
|
|
@ -4,8 +4,7 @@ import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import mekanism.api.Coord4D;
|
import mekanism.api.Coord4D;
|
||||||
import mekanism.common.content.tank.SynchronizedTankData;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
|
||||||
|
|
||||||
public abstract class SynchronizedData<T>
|
public abstract class SynchronizedData<T>
|
||||||
{
|
{
|
||||||
|
@ -21,6 +20,17 @@ public abstract class SynchronizedData<T>
|
||||||
|
|
||||||
public int inventoryID;
|
public int inventoryID;
|
||||||
|
|
||||||
|
public boolean didTick;
|
||||||
|
|
||||||
|
public boolean hasRenderer;
|
||||||
|
|
||||||
|
public Coord4D renderLocation;
|
||||||
|
|
||||||
|
public ItemStack[] getInventory()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode()
|
public int hashCode()
|
||||||
{
|
{
|
||||||
|
|
|
@ -11,46 +11,27 @@ import mekanism.api.Range4D;
|
||||||
import mekanism.common.Mekanism;
|
import mekanism.common.Mekanism;
|
||||||
import mekanism.common.base.IFluidContainerManager;
|
import mekanism.common.base.IFluidContainerManager;
|
||||||
import mekanism.common.content.tank.SynchronizedTankData;
|
import mekanism.common.content.tank.SynchronizedTankData;
|
||||||
import mekanism.common.content.tank.TankUpdateProtocol;
|
|
||||||
import mekanism.common.content.tank.SynchronizedTankData.ValveData;
|
import mekanism.common.content.tank.SynchronizedTankData.ValveData;
|
||||||
|
import mekanism.common.content.tank.TankUpdateProtocol;
|
||||||
import mekanism.common.multiblock.IMultiblock;
|
import mekanism.common.multiblock.IMultiblock;
|
||||||
import mekanism.common.multiblock.SynchronizedData;
|
import mekanism.common.multiblock.MultiblockManager;
|
||||||
import mekanism.common.network.PacketTileEntity.TileEntityMessage;
|
import mekanism.common.network.PacketTileEntity.TileEntityMessage;
|
||||||
import mekanism.common.util.FluidContainerUtils;
|
import mekanism.common.util.FluidContainerUtils;
|
||||||
import mekanism.common.util.FluidContainerUtils.ContainerEditMode;
|
import mekanism.common.util.FluidContainerUtils.ContainerEditMode;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.util.AxisAlignedBB;
|
|
||||||
import net.minecraftforge.common.util.ForgeDirection;
|
import net.minecraftforge.common.util.ForgeDirection;
|
||||||
import net.minecraftforge.fluids.FluidContainerRegistry;
|
import net.minecraftforge.fluids.FluidContainerRegistry;
|
||||||
import net.minecraftforge.fluids.FluidStack;
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
import net.minecraftforge.fluids.IFluidContainerItem;
|
import net.minecraftforge.fluids.IFluidContainerItem;
|
||||||
import cpw.mods.fml.relauncher.Side;
|
|
||||||
import cpw.mods.fml.relauncher.SideOnly;
|
|
||||||
|
|
||||||
public class TileEntityDynamicTank extends TileEntityContainerBlock implements IFluidContainerManager, IMultiblock<SynchronizedTankData>
|
public class TileEntityDynamicTank extends TileEntityMultiblock<SynchronizedTankData> implements IFluidContainerManager, IMultiblock<SynchronizedTankData>
|
||||||
{
|
{
|
||||||
/** The tank data for this structure. */
|
|
||||||
public SynchronizedTankData structure;
|
|
||||||
|
|
||||||
/** Whether or not to send this tank's structure in the next update packet. */
|
|
||||||
public boolean sendStructure;
|
|
||||||
|
|
||||||
/** This tank's previous "has structure" state. */
|
|
||||||
public boolean prevStructure;
|
|
||||||
|
|
||||||
/** Whether or not this tank has it's structure, for the client side mechanics. */
|
|
||||||
public boolean clientHasStructure;
|
|
||||||
|
|
||||||
/** A client-sided and server-sided map of valves on this tank's structure, used on the client for rendering fluids. */
|
/** A client-sided and server-sided map of valves on this tank's structure, used on the client for rendering fluids. */
|
||||||
public Map<ValveData, Integer> valveViewing = new HashMap<ValveData, Integer>();
|
public Map<ValveData, Integer> valveViewing = new HashMap<ValveData, Integer>();
|
||||||
|
|
||||||
/** The capacity this tank has on the client-side. */
|
/** The capacity this tank has on the client-side. */
|
||||||
public int clientCapacity;
|
public int clientCapacity;
|
||||||
|
|
||||||
/** Whether or not this tank segment is rendering the structure. */
|
|
||||||
public boolean isRendering;
|
|
||||||
|
|
||||||
public float prevScale;
|
public float prevScale;
|
||||||
|
|
||||||
public TileEntityDynamicTank()
|
public TileEntityDynamicTank()
|
||||||
|
@ -64,29 +45,13 @@ public class TileEntityDynamicTank extends TileEntityContainerBlock implements I
|
||||||
inventory = new ItemStack[2];
|
inventory = new ItemStack[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
public void update()
|
|
||||||
{
|
|
||||||
if(!worldObj.isRemote && (structure == null || !structure.didTick))
|
|
||||||
{
|
|
||||||
new TankUpdateProtocol(this).updateTanks();
|
|
||||||
|
|
||||||
if(structure != null)
|
|
||||||
{
|
|
||||||
structure.didTick = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onUpdate()
|
public void onUpdate()
|
||||||
{
|
{
|
||||||
|
super.onUpdate();
|
||||||
|
|
||||||
if(worldObj.isRemote)
|
if(worldObj.isRemote)
|
||||||
{
|
{
|
||||||
if(structure == null)
|
|
||||||
{
|
|
||||||
structure = new SynchronizedTankData();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(structure != null && clientHasStructure && isRendering)
|
if(structure != null && clientHasStructure && isRendering)
|
||||||
{
|
{
|
||||||
for(ValveData data : valveViewing.keySet())
|
for(ValveData data : valveViewing.keySet())
|
||||||
|
@ -97,11 +62,6 @@ public class TileEntityDynamicTank extends TileEntityContainerBlock implements I
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!prevStructure)
|
|
||||||
{
|
|
||||||
Mekanism.proxy.doTankAnimation(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
float targetScale = (float)(structure.fluidStored != null ? structure.fluidStored.amount : 0)/clientCapacity;
|
float targetScale = (float)(structure.fluidStored != null ? structure.fluidStored.amount : 0)/clientCapacity;
|
||||||
|
|
||||||
if(Math.abs(prevScale - targetScale) > 0.01)
|
if(Math.abs(prevScale - targetScale) > 0.01)
|
||||||
|
@ -110,8 +70,6 @@ public class TileEntityDynamicTank extends TileEntityContainerBlock implements I
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
prevStructure = clientHasStructure;
|
|
||||||
|
|
||||||
if(!clientHasStructure || !isRendering)
|
if(!clientHasStructure || !isRendering)
|
||||||
{
|
{
|
||||||
for(ValveData data : valveViewing.keySet())
|
for(ValveData data : valveViewing.keySet())
|
||||||
|
@ -128,59 +86,10 @@ public class TileEntityDynamicTank extends TileEntityContainerBlock implements I
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(playersUsing.size() > 0 && ((worldObj.isRemote && !clientHasStructure) || (!worldObj.isRemote && structure == null)))
|
|
||||||
{
|
|
||||||
for(EntityPlayer player : playersUsing)
|
|
||||||
{
|
|
||||||
player.closeScreen();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!worldObj.isRemote)
|
if(!worldObj.isRemote)
|
||||||
{
|
{
|
||||||
if(structure == null)
|
|
||||||
{
|
|
||||||
isRendering = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(structure == null && ticker == 5)
|
|
||||||
{
|
|
||||||
update();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(prevStructure != (structure != null))
|
|
||||||
{
|
|
||||||
if(structure != null && !structure.hasRenderer)
|
|
||||||
{
|
|
||||||
structure.hasRenderer = true;
|
|
||||||
isRendering = true;
|
|
||||||
sendStructure = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(ForgeDirection side : ForgeDirection.VALID_DIRECTIONS)
|
|
||||||
{
|
|
||||||
Coord4D obj = Coord4D.get(this).getFromSide(side);
|
|
||||||
|
|
||||||
if(!obj.isAirBlock(worldObj) && !(obj.getTileEntity(worldObj) instanceof TileEntityDynamicTank))
|
|
||||||
{
|
|
||||||
obj.getBlock(worldObj).onNeighborChange(worldObj, obj.xCoord, obj.yCoord, obj.zCoord, xCoord, yCoord, zCoord);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Mekanism.packetHandler.sendToReceivers(new TileEntityMessage(Coord4D.get(this), getNetworkedData(new ArrayList())), new Range4D(Coord4D.get(this)));
|
|
||||||
}
|
|
||||||
|
|
||||||
prevStructure = structure != null;
|
|
||||||
|
|
||||||
if(structure != null)
|
if(structure != null)
|
||||||
{
|
{
|
||||||
structure.didTick = false;
|
|
||||||
|
|
||||||
if(structure.inventoryID != -1)
|
|
||||||
{
|
|
||||||
Mekanism.tankManager.updateCache(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
manageInventory();
|
manageInventory();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -345,14 +254,23 @@ public class TileEntityDynamicTank extends TileEntityContainerBlock implements I
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SynchronizedTankData getNewStructure()
|
||||||
|
{
|
||||||
|
return new SynchronizedTankData();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MultiblockManager<SynchronizedTankData> getManager()
|
||||||
|
{
|
||||||
|
return Mekanism.tankManager;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ArrayList getNetworkedData(ArrayList data)
|
public ArrayList getNetworkedData(ArrayList data)
|
||||||
{
|
{
|
||||||
super.getNetworkedData(data);
|
super.getNetworkedData(data);
|
||||||
|
|
||||||
data.add(isRendering);
|
|
||||||
data.add(structure != null);
|
|
||||||
|
|
||||||
if(structure != null)
|
if(structure != null)
|
||||||
{
|
{
|
||||||
|
@ -372,22 +290,6 @@ public class TileEntityDynamicTank extends TileEntityContainerBlock implements I
|
||||||
|
|
||||||
if(structure != null && isRendering)
|
if(structure != null && isRendering)
|
||||||
{
|
{
|
||||||
if(sendStructure)
|
|
||||||
{
|
|
||||||
sendStructure = false;
|
|
||||||
|
|
||||||
data.add(true);
|
|
||||||
|
|
||||||
data.add(structure.volHeight);
|
|
||||||
data.add(structure.volWidth);
|
|
||||||
data.add(structure.volLength);
|
|
||||||
|
|
||||||
structure.renderLocation.write(data);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
data.add(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
data.add(structure.valves.size());
|
data.add(structure.valves.size());
|
||||||
|
|
||||||
for(ValveData valveData : structure.valves)
|
for(ValveData valveData : structure.valves)
|
||||||
|
@ -406,14 +308,6 @@ public class TileEntityDynamicTank extends TileEntityContainerBlock implements I
|
||||||
public void handlePacketData(ByteBuf dataStream)
|
public void handlePacketData(ByteBuf dataStream)
|
||||||
{
|
{
|
||||||
super.handlePacketData(dataStream);
|
super.handlePacketData(dataStream);
|
||||||
|
|
||||||
if(structure == null)
|
|
||||||
{
|
|
||||||
structure = new SynchronizedTankData();
|
|
||||||
}
|
|
||||||
|
|
||||||
isRendering = dataStream.readBoolean();
|
|
||||||
clientHasStructure = dataStream.readBoolean();
|
|
||||||
|
|
||||||
if(clientHasStructure)
|
if(clientHasStructure)
|
||||||
{
|
{
|
||||||
|
@ -431,15 +325,6 @@ public class TileEntityDynamicTank extends TileEntityContainerBlock implements I
|
||||||
|
|
||||||
if(clientHasStructure && isRendering)
|
if(clientHasStructure && isRendering)
|
||||||
{
|
{
|
||||||
if(dataStream.readBoolean())
|
|
||||||
{
|
|
||||||
structure.volHeight = dataStream.readInt();
|
|
||||||
structure.volWidth = dataStream.readInt();
|
|
||||||
structure.volLength = dataStream.readInt();
|
|
||||||
|
|
||||||
structure.renderLocation = Coord4D.read(dataStream);
|
|
||||||
}
|
|
||||||
|
|
||||||
int size = dataStream.readInt();
|
int size = dataStream.readInt();
|
||||||
|
|
||||||
for(int i = 0; i < size; i++)
|
for(int i = 0; i < size; i++)
|
||||||
|
@ -474,22 +359,6 @@ public class TileEntityDynamicTank extends TileEntityContainerBlock implements I
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendPacketToRenderer()
|
|
||||||
{
|
|
||||||
if(structure != null)
|
|
||||||
{
|
|
||||||
for(Coord4D obj : structure.locations)
|
|
||||||
{
|
|
||||||
TileEntityDynamicTank tileEntity = (TileEntityDynamicTank)obj.getTileEntity(worldObj);
|
|
||||||
|
|
||||||
if(tileEntity != null && tileEntity.isRendering)
|
|
||||||
{
|
|
||||||
Mekanism.packetHandler.sendToReceivers(new TileEntityMessage(Coord4D.get(tileEntity), tileEntity.getNetworkedData(new ArrayList())), new Range4D(Coord4D.get(tileEntity)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getScaledFluidLevel(int i)
|
public int getScaledFluidLevel(int i)
|
||||||
{
|
{
|
||||||
if(clientCapacity == 0 || structure.fluidStored == null)
|
if(clientCapacity == 0 || structure.fluidStored == null)
|
||||||
|
@ -500,33 +369,6 @@ public class TileEntityDynamicTank extends TileEntityContainerBlock implements I
|
||||||
return structure.fluidStored.amount*i / clientCapacity;
|
return structure.fluidStored.amount*i / clientCapacity;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack getStackInSlot(int slotID)
|
|
||||||
{
|
|
||||||
return structure != null ? structure.inventory[slotID] : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setInventorySlotContents(int slotID, ItemStack itemstack)
|
|
||||||
{
|
|
||||||
if(structure != null)
|
|
||||||
{
|
|
||||||
structure.inventory[slotID] = itemstack;
|
|
||||||
|
|
||||||
if(itemstack != null && itemstack.stackSize > getInventoryStackLimit())
|
|
||||||
{
|
|
||||||
itemstack.stackSize = getInventoryStackLimit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@SideOnly(Side.CLIENT)
|
|
||||||
public AxisAlignedBB getRenderBoundingBox()
|
|
||||||
{
|
|
||||||
return INFINITE_EXTENT_AABB;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ContainerEditMode getContainerEditMode()
|
public ContainerEditMode getContainerEditMode()
|
||||||
{
|
{
|
||||||
|
@ -548,16 +390,4 @@ public class TileEntityDynamicTank extends TileEntityContainerBlock implements I
|
||||||
|
|
||||||
structure.editMode = mode;
|
structure.editMode = mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean handleInventory()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public SynchronizedData<SynchronizedTankData> getSynchronizedData()
|
|
||||||
{
|
|
||||||
return structure;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
248
src/main/java/mekanism/common/tile/TileEntityMultiblock.java
Normal file
248
src/main/java/mekanism/common/tile/TileEntityMultiblock.java
Normal file
|
@ -0,0 +1,248 @@
|
||||||
|
package mekanism.common.tile;
|
||||||
|
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import mekanism.api.Coord4D;
|
||||||
|
import mekanism.api.Range4D;
|
||||||
|
import mekanism.common.Mekanism;
|
||||||
|
import mekanism.common.content.tank.TankUpdateProtocol;
|
||||||
|
import mekanism.common.multiblock.IMultiblock;
|
||||||
|
import mekanism.common.multiblock.MultiblockManager;
|
||||||
|
import mekanism.common.multiblock.SynchronizedData;
|
||||||
|
import mekanism.common.network.PacketTileEntity.TileEntityMessage;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.util.AxisAlignedBB;
|
||||||
|
import net.minecraftforge.common.util.ForgeDirection;
|
||||||
|
import cpw.mods.fml.relauncher.Side;
|
||||||
|
import cpw.mods.fml.relauncher.SideOnly;
|
||||||
|
|
||||||
|
public abstract class TileEntityMultiblock<T> extends TileEntityContainerBlock implements IMultiblock<T>
|
||||||
|
{
|
||||||
|
/** The tank data for this structure. */
|
||||||
|
public T structure;
|
||||||
|
|
||||||
|
/** Whether or not to send this tank's structure in the next update packet. */
|
||||||
|
public boolean sendStructure;
|
||||||
|
|
||||||
|
/** This tank's previous "has structure" state. */
|
||||||
|
public boolean prevStructure;
|
||||||
|
|
||||||
|
/** Whether or not this tank has it's structure, for the client side mechanics. */
|
||||||
|
public boolean clientHasStructure;
|
||||||
|
|
||||||
|
/** Whether or not this tank segment is rendering the structure. */
|
||||||
|
public boolean isRendering;
|
||||||
|
|
||||||
|
public TileEntityMultiblock(String name)
|
||||||
|
{
|
||||||
|
super(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onUpdate()
|
||||||
|
{
|
||||||
|
if(worldObj.isRemote)
|
||||||
|
{
|
||||||
|
if(structure == null)
|
||||||
|
{
|
||||||
|
structure = getNewStructure();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(structure != null && clientHasStructure && isRendering)
|
||||||
|
{
|
||||||
|
if(!prevStructure)
|
||||||
|
{
|
||||||
|
Mekanism.proxy.doTankAnimation(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
prevStructure = clientHasStructure;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(playersUsing.size() > 0 && ((worldObj.isRemote && !clientHasStructure) || (!worldObj.isRemote && structure == null)))
|
||||||
|
{
|
||||||
|
for(EntityPlayer player : playersUsing)
|
||||||
|
{
|
||||||
|
player.closeScreen();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!worldObj.isRemote)
|
||||||
|
{
|
||||||
|
if(structure == null)
|
||||||
|
{
|
||||||
|
isRendering = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(structure == null && ticker == 5)
|
||||||
|
{
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(prevStructure != (structure != null))
|
||||||
|
{
|
||||||
|
if(structure != null && !getSynchronizedData().hasRenderer)
|
||||||
|
{
|
||||||
|
getSynchronizedData().hasRenderer = true;
|
||||||
|
isRendering = true;
|
||||||
|
sendStructure = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(ForgeDirection side : ForgeDirection.VALID_DIRECTIONS)
|
||||||
|
{
|
||||||
|
Coord4D obj = Coord4D.get(this).getFromSide(side);
|
||||||
|
|
||||||
|
if(!obj.isAirBlock(worldObj) && (obj.getTileEntity(worldObj) == null || obj.getTileEntity(worldObj).getClass() != getClass()))
|
||||||
|
{
|
||||||
|
obj.getBlock(worldObj).onNeighborChange(worldObj, obj.xCoord, obj.yCoord, obj.zCoord, xCoord, yCoord, zCoord);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Mekanism.packetHandler.sendToReceivers(new TileEntityMessage(Coord4D.get(this), getNetworkedData(new ArrayList())), new Range4D(Coord4D.get(this)));
|
||||||
|
}
|
||||||
|
|
||||||
|
prevStructure = structure != null;
|
||||||
|
|
||||||
|
if(structure != null)
|
||||||
|
{
|
||||||
|
getSynchronizedData().didTick = false;
|
||||||
|
|
||||||
|
if(getSynchronizedData().inventoryID != -1)
|
||||||
|
{
|
||||||
|
getManager().updateCache(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update()
|
||||||
|
{
|
||||||
|
if(!worldObj.isRemote && (structure == null || !getSynchronizedData().didTick))
|
||||||
|
{
|
||||||
|
new TankUpdateProtocol(this).updateTanks();
|
||||||
|
|
||||||
|
if(structure != null)
|
||||||
|
{
|
||||||
|
getSynchronizedData().didTick = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendPacketToRenderer()
|
||||||
|
{
|
||||||
|
if(structure != null)
|
||||||
|
{
|
||||||
|
for(Coord4D obj : getSynchronizedData().locations)
|
||||||
|
{
|
||||||
|
TileEntityDynamicTank tileEntity = (TileEntityDynamicTank)obj.getTileEntity(worldObj);
|
||||||
|
|
||||||
|
if(tileEntity != null && tileEntity.isRendering)
|
||||||
|
{
|
||||||
|
Mekanism.packetHandler.sendToReceivers(new TileEntityMessage(Coord4D.get(tileEntity), tileEntity.getNetworkedData(new ArrayList())), new Range4D(Coord4D.get(tileEntity)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract T getNewStructure();
|
||||||
|
|
||||||
|
protected abstract MultiblockManager<T> getManager();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ArrayList getNetworkedData(ArrayList data)
|
||||||
|
{
|
||||||
|
super.getNetworkedData(data);
|
||||||
|
|
||||||
|
data.add(isRendering);
|
||||||
|
data.add(structure != null);
|
||||||
|
|
||||||
|
if(structure != null && isRendering)
|
||||||
|
{
|
||||||
|
if(sendStructure)
|
||||||
|
{
|
||||||
|
sendStructure = false;
|
||||||
|
|
||||||
|
data.add(true);
|
||||||
|
|
||||||
|
data.add(getSynchronizedData().volHeight);
|
||||||
|
data.add(getSynchronizedData().volWidth);
|
||||||
|
data.add(getSynchronizedData().volLength);
|
||||||
|
|
||||||
|
getSynchronizedData().renderLocation.write(data);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
data.add(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handlePacketData(ByteBuf dataStream)
|
||||||
|
{
|
||||||
|
super.handlePacketData(dataStream);
|
||||||
|
|
||||||
|
if(structure == null)
|
||||||
|
{
|
||||||
|
structure = getNewStructure();
|
||||||
|
}
|
||||||
|
|
||||||
|
isRendering = dataStream.readBoolean();
|
||||||
|
clientHasStructure = dataStream.readBoolean();
|
||||||
|
|
||||||
|
if(clientHasStructure && isRendering)
|
||||||
|
{
|
||||||
|
if(dataStream.readBoolean())
|
||||||
|
{
|
||||||
|
getSynchronizedData().volHeight = dataStream.readInt();
|
||||||
|
getSynchronizedData().volWidth = dataStream.readInt();
|
||||||
|
getSynchronizedData().volLength = dataStream.readInt();
|
||||||
|
|
||||||
|
getSynchronizedData().renderLocation = Coord4D.read(dataStream);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack getStackInSlot(int slotID)
|
||||||
|
{
|
||||||
|
return structure != null && getSynchronizedData().getInventory() != null ? getSynchronizedData().getInventory()[slotID] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setInventorySlotContents(int slotID, ItemStack itemstack)
|
||||||
|
{
|
||||||
|
if(structure != null && getSynchronizedData().getInventory() != null)
|
||||||
|
{
|
||||||
|
getSynchronizedData().getInventory()[slotID] = itemstack;
|
||||||
|
|
||||||
|
if(itemstack != null && itemstack.stackSize > getInventoryStackLimit())
|
||||||
|
{
|
||||||
|
itemstack.stackSize = getInventoryStackLimit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SideOnly(Side.CLIENT)
|
||||||
|
public AxisAlignedBB getRenderBoundingBox()
|
||||||
|
{
|
||||||
|
return INFINITE_EXTENT_AABB;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean handleInventory()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SynchronizedData<T> getSynchronizedData()
|
||||||
|
{
|
||||||
|
return (SynchronizedData<T>)structure;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue