Dynamic Tanks are now server friendly, closes #2690

This commit is contained in:
aidancbrady 2015-06-17 13:26:47 -04:00
parent 81511d3800
commit b9f80c0365
4 changed files with 89 additions and 58 deletions

View file

@ -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()
{

View file

@ -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();
}
}
}

View file

@ -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()

View file

@ -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);