Dynamic Tanks are now server friendly, closes #2690
This commit is contained in:
parent
81511d3800
commit
b9f80c0365
4 changed files with 89 additions and 58 deletions
|
@ -73,9 +73,7 @@ public class RenderDynamicTank extends TileEntitySpecialRenderer
|
|||
|
||||
pop();
|
||||
|
||||
for(ValveData valveData : tileEntity.valveViewing.keySet())
|
||||
{
|
||||
if(tileEntity.valveViewing.get(valveData) > 0)
|
||||
for(ValveData valveData : tileEntity.valveViewing)
|
||||
{
|
||||
push();
|
||||
|
||||
|
@ -93,7 +91,6 @@ public class RenderDynamicTank extends TileEntitySpecialRenderer
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void pop()
|
||||
{
|
||||
|
|
|
@ -55,9 +55,7 @@ public class DynamicFluidTank implements IFluidTank
|
|||
if(resource.amount > 0)
|
||||
{
|
||||
MekanismUtils.saveChunk(dynamicTank);
|
||||
updateValveData(true);
|
||||
dynamicTank.sendPacketToRenderer();
|
||||
updateValveData(false);
|
||||
updateValveData();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -72,9 +70,7 @@ public class DynamicFluidTank implements IFluidTank
|
|||
if(getCapacity() > 0)
|
||||
{
|
||||
MekanismUtils.saveChunk(dynamicTank);
|
||||
updateValveData(true);
|
||||
dynamicTank.sendPacketToRenderer();
|
||||
updateValveData(false);
|
||||
updateValveData();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -90,9 +86,7 @@ public class DynamicFluidTank implements IFluidTank
|
|||
if(resource.amount > 0)
|
||||
{
|
||||
MekanismUtils.saveChunk(dynamicTank);
|
||||
updateValveData(true);
|
||||
dynamicTank.sendPacketToRenderer();
|
||||
updateValveData(false);
|
||||
updateValveData();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -108,9 +102,7 @@ public class DynamicFluidTank implements IFluidTank
|
|||
if(prevNeeded > 0)
|
||||
{
|
||||
MekanismUtils.saveChunk(dynamicTank);
|
||||
updateValveData(true);
|
||||
dynamicTank.sendPacketToRenderer();
|
||||
updateValveData(false);
|
||||
updateValveData();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -121,7 +113,7 @@ public class DynamicFluidTank implements IFluidTank
|
|||
return 0;
|
||||
}
|
||||
|
||||
public void updateValveData(boolean value)
|
||||
public void updateValveData()
|
||||
{
|
||||
if(dynamicTank.structure != null)
|
||||
{
|
||||
|
@ -129,7 +121,7 @@ public class DynamicFluidTank implements IFluidTank
|
|||
{
|
||||
if(data.location.equals(Coord4D.get(dynamicTank)))
|
||||
{
|
||||
data.serverFluid = value;
|
||||
data.onTransfer();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,21 +6,42 @@ import java.util.Set;
|
|||
import mekanism.api.Coord4D;
|
||||
import mekanism.common.multiblock.SynchronizedData;
|
||||
import mekanism.common.util.FluidContainerUtils.ContainerEditMode;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
|
||||
public class SynchronizedTankData extends SynchronizedData<SynchronizedTankData>
|
||||
{
|
||||
public FluidStack fluidStored;
|
||||
|
||||
/** For use by rendering segment */
|
||||
public FluidStack prevFluid;
|
||||
|
||||
public ContainerEditMode editMode = ContainerEditMode.BOTH;
|
||||
|
||||
public ItemStack[] inventory = new ItemStack[2];
|
||||
|
||||
public Set<ValveData> valves = new HashSet<ValveData>();
|
||||
|
||||
public boolean needsRenderUpdate()
|
||||
{
|
||||
if((fluidStored == null && prevFluid != null) || (fluidStored != null && prevFluid == null))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if(fluidStored != null && prevFluid != null)
|
||||
{
|
||||
if((fluidStored.getFluid() != prevFluid.getFluid()) || (fluidStored.amount != prevFluid.amount))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack[] getInventory()
|
||||
{
|
||||
|
@ -31,7 +52,14 @@ public class SynchronizedTankData extends SynchronizedData<SynchronizedTankData>
|
|||
{
|
||||
public ForgeDirection side;
|
||||
public Coord4D location;
|
||||
public boolean serverFluid;
|
||||
|
||||
public boolean prevActive;
|
||||
public int activeTicks;
|
||||
|
||||
public void onTransfer()
|
||||
{
|
||||
activeTicks = 30;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode()
|
||||
|
|
|
@ -3,8 +3,8 @@ package mekanism.common.tile;
|
|||
import io.netty.buffer.ByteBuf;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import mekanism.api.Coord4D;
|
||||
import mekanism.api.Range4D;
|
||||
|
@ -26,8 +26,8 @@ import net.minecraftforge.fluids.IFluidContainerItem;
|
|||
|
||||
public class TileEntityDynamicTank extends TileEntityMultiblock<SynchronizedTankData> implements IFluidContainerManager
|
||||
{
|
||||
/** 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>();
|
||||
/** A client-sided set of valves on this tank's structure that are currently active, used on the client for rendering fluids. */
|
||||
public Set<ValveData> valveViewing = new HashSet<ValveData>();
|
||||
|
||||
/** The capacity this tank has on the client-side. */
|
||||
public int clientCapacity;
|
||||
|
@ -54,14 +54,6 @@ public class TileEntityDynamicTank extends TileEntityMultiblock<SynchronizedTank
|
|||
{
|
||||
if(structure != null && clientHasStructure && isRendering)
|
||||
{
|
||||
for(ValveData data : valveViewing.keySet())
|
||||
{
|
||||
if(valveViewing.get(data) > 0)
|
||||
{
|
||||
valveViewing.put(data, valveViewing.get(data)-1);
|
||||
}
|
||||
}
|
||||
|
||||
float targetScale = (float)(structure.fluidStored != null ? structure.fluidStored.amount : 0)/clientCapacity;
|
||||
|
||||
if(Math.abs(prevScale - targetScale) > 0.01)
|
||||
|
@ -72,7 +64,7 @@ public class TileEntityDynamicTank extends TileEntityMultiblock<SynchronizedTank
|
|||
|
||||
if(!clientHasStructure || !isRendering)
|
||||
{
|
||||
for(ValveData data : valveViewing.keySet())
|
||||
for(ValveData data : valveViewing)
|
||||
{
|
||||
TileEntityDynamicTank tileEntity = (TileEntityDynamicTank)data.location.getTileEntity(worldObj);
|
||||
|
||||
|
@ -96,6 +88,31 @@ public class TileEntityDynamicTank extends TileEntityMultiblock<SynchronizedTank
|
|||
markDirty();
|
||||
}
|
||||
|
||||
if(isRendering)
|
||||
{
|
||||
boolean needsValveUpdate = false;
|
||||
|
||||
for(ValveData data : structure.valves)
|
||||
{
|
||||
if(data.activeTicks > 0)
|
||||
{
|
||||
data.activeTicks--;
|
||||
}
|
||||
|
||||
if(data.activeTicks > 0 != data.prevActive)
|
||||
{
|
||||
needsValveUpdate = true;
|
||||
}
|
||||
|
||||
data.prevActive = data.activeTicks > 0;
|
||||
}
|
||||
|
||||
if(needsValveUpdate || structure.needsRenderUpdate())
|
||||
{
|
||||
sendPacketToRenderer();
|
||||
}
|
||||
}
|
||||
|
||||
manageInventory();
|
||||
}
|
||||
}
|
||||
|
@ -307,13 +324,22 @@ public class TileEntityDynamicTank extends TileEntityMultiblock<SynchronizedTank
|
|||
|
||||
if(isRendering)
|
||||
{
|
||||
data.add(structure.valves.size());
|
||||
Set<ValveData> toSend = new HashSet<ValveData>();
|
||||
|
||||
for(ValveData valveData : structure.valves)
|
||||
{
|
||||
if(valveData.activeTicks > 0)
|
||||
{
|
||||
toSend.add(valveData);
|
||||
}
|
||||
}
|
||||
|
||||
data.add(toSend.size());
|
||||
|
||||
for(ValveData valveData : toSend)
|
||||
{
|
||||
valveData.location.write(data);
|
||||
data.add(valveData.side.ordinal());
|
||||
data.add(valveData.serverFluid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -343,27 +369,15 @@ public class TileEntityDynamicTank extends TileEntityMultiblock<SynchronizedTank
|
|||
{
|
||||
int size = dataStream.readInt();
|
||||
|
||||
valveViewing.clear();
|
||||
|
||||
for(int i = 0; i < size; i++)
|
||||
{
|
||||
ValveData data = new ValveData();
|
||||
data.location = Coord4D.read(dataStream);
|
||||
data.side = ForgeDirection.getOrientation(dataStream.readInt());
|
||||
int viewingTicks = 0;
|
||||
|
||||
if(dataStream.readBoolean())
|
||||
{
|
||||
viewingTicks = 30;
|
||||
}
|
||||
|
||||
if(viewingTicks == 0)
|
||||
{
|
||||
if(valveViewing.containsKey(data) && valveViewing.get(data) > 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
valveViewing.put(data, viewingTicks);
|
||||
valveViewing.add(data);
|
||||
|
||||
TileEntityDynamicTank tileEntity = (TileEntityDynamicTank)data.location.getTileEntity(worldObj);
|
||||
|
||||
|
|
Loading…
Reference in a new issue