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,23 +73,20 @@ public class RenderDynamicTank extends TileEntitySpecialRenderer
pop(); pop();
for(ValveData valveData : tileEntity.valveViewing.keySet()) for(ValveData valveData : tileEntity.valveViewing)
{ {
if(tileEntity.valveViewing.get(valveData) > 0) push();
{
push();
GL11.glTranslated(getX(valveData.location.xCoord), getY(valveData.location.yCoord), getZ(valveData.location.zCoord)); GL11.glTranslated(getX(valveData.location.xCoord), getY(valveData.location.yCoord), getZ(valveData.location.zCoord));
MekanismRenderer.glowOn(tileEntity.structure.fluidStored.getFluid().getLuminosity()); MekanismRenderer.glowOn(tileEntity.structure.fluidStored.getFluid().getLuminosity());
getValveDisplay(ValveRenderData.get(data, valveData), tileEntity.structure.fluidStored.getFluid(), tileEntity.getWorldObj()).render(); getValveDisplay(ValveRenderData.get(data, valveData), tileEntity.structure.fluidStored.getFluid(), tileEntity.getWorldObj()).render();
MekanismRenderer.glowOff(); MekanismRenderer.glowOff();
MekanismRenderer.resetColor(); MekanismRenderer.resetColor();
pop(); pop();
}
} }
} }
} }

View file

@ -55,9 +55,7 @@ public class DynamicFluidTank implements IFluidTank
if(resource.amount > 0) if(resource.amount > 0)
{ {
MekanismUtils.saveChunk(dynamicTank); MekanismUtils.saveChunk(dynamicTank);
updateValveData(true); updateValveData();
dynamicTank.sendPacketToRenderer();
updateValveData(false);
} }
} }
@ -72,9 +70,7 @@ public class DynamicFluidTank implements IFluidTank
if(getCapacity() > 0) if(getCapacity() > 0)
{ {
MekanismUtils.saveChunk(dynamicTank); MekanismUtils.saveChunk(dynamicTank);
updateValveData(true); updateValveData();
dynamicTank.sendPacketToRenderer();
updateValveData(false);
} }
} }
@ -90,9 +86,7 @@ public class DynamicFluidTank implements IFluidTank
if(resource.amount > 0) if(resource.amount > 0)
{ {
MekanismUtils.saveChunk(dynamicTank); MekanismUtils.saveChunk(dynamicTank);
updateValveData(true); updateValveData();
dynamicTank.sendPacketToRenderer();
updateValveData(false);
} }
} }
@ -108,9 +102,7 @@ public class DynamicFluidTank implements IFluidTank
if(prevNeeded > 0) if(prevNeeded > 0)
{ {
MekanismUtils.saveChunk(dynamicTank); MekanismUtils.saveChunk(dynamicTank);
updateValveData(true); updateValveData();
dynamicTank.sendPacketToRenderer();
updateValveData(false);
} }
} }
@ -121,7 +113,7 @@ public class DynamicFluidTank implements IFluidTank
return 0; return 0;
} }
public void updateValveData(boolean value) public void updateValveData()
{ {
if(dynamicTank.structure != null) if(dynamicTank.structure != null)
{ {
@ -129,7 +121,7 @@ public class DynamicFluidTank implements IFluidTank
{ {
if(data.location.equals(Coord4D.get(dynamicTank))) 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.api.Coord4D;
import mekanism.common.multiblock.SynchronizedData; import mekanism.common.multiblock.SynchronizedData;
import mekanism.common.util.FluidContainerUtils.ContainerEditMode; import mekanism.common.util.FluidContainerUtils.ContainerEditMode;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
public class SynchronizedTankData extends SynchronizedData<SynchronizedTankData> public class SynchronizedTankData extends SynchronizedData<SynchronizedTankData>
{ {
public FluidStack fluidStored; public FluidStack fluidStored;
/** For use by rendering segment */
public FluidStack prevFluid;
public ContainerEditMode editMode = ContainerEditMode.BOTH; public ContainerEditMode editMode = ContainerEditMode.BOTH;
public ItemStack[] inventory = new ItemStack[2]; public ItemStack[] inventory = new ItemStack[2];
public Set<ValveData> valves = new HashSet<ValveData>(); 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 @Override
public ItemStack[] getInventory() public ItemStack[] getInventory()
{ {
@ -31,7 +52,14 @@ public class SynchronizedTankData extends SynchronizedData<SynchronizedTankData>
{ {
public ForgeDirection side; public ForgeDirection side;
public Coord4D location; public Coord4D location;
public boolean serverFluid;
public boolean prevActive;
public int activeTicks;
public void onTransfer()
{
activeTicks = 30;
}
@Override @Override
public int hashCode() public int hashCode()

View file

@ -3,8 +3,8 @@ package mekanism.common.tile;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashSet;
import java.util.Map; import java.util.Set;
import mekanism.api.Coord4D; import mekanism.api.Coord4D;
import mekanism.api.Range4D; import mekanism.api.Range4D;
@ -26,8 +26,8 @@ import net.minecraftforge.fluids.IFluidContainerItem;
public class TileEntityDynamicTank extends TileEntityMultiblock<SynchronizedTankData> implements IFluidContainerManager 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. */ /** A client-sided set of valves on this tank's structure that are currently active, used on the client for rendering fluids. */
public Map<ValveData, Integer> valveViewing = new HashMap<ValveData, Integer>(); public Set<ValveData> valveViewing = new HashSet<ValveData>();
/** The capacity this tank has on the client-side. */ /** The capacity this tank has on the client-side. */
public int clientCapacity; public int clientCapacity;
@ -54,14 +54,6 @@ public class TileEntityDynamicTank extends TileEntityMultiblock<SynchronizedTank
{ {
if(structure != null && clientHasStructure && isRendering) 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; 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)
@ -72,7 +64,7 @@ public class TileEntityDynamicTank extends TileEntityMultiblock<SynchronizedTank
if(!clientHasStructure || !isRendering) if(!clientHasStructure || !isRendering)
{ {
for(ValveData data : valveViewing.keySet()) for(ValveData data : valveViewing)
{ {
TileEntityDynamicTank tileEntity = (TileEntityDynamicTank)data.location.getTileEntity(worldObj); TileEntityDynamicTank tileEntity = (TileEntityDynamicTank)data.location.getTileEntity(worldObj);
@ -96,6 +88,31 @@ public class TileEntityDynamicTank extends TileEntityMultiblock<SynchronizedTank
markDirty(); 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(); manageInventory();
} }
} }
@ -307,13 +324,22 @@ public class TileEntityDynamicTank extends TileEntityMultiblock<SynchronizedTank
if(isRendering) if(isRendering)
{ {
data.add(structure.valves.size()); Set<ValveData> toSend = new HashSet<ValveData>();
for(ValveData valveData : structure.valves) for(ValveData valveData : structure.valves)
{
if(valveData.activeTicks > 0)
{
toSend.add(valveData);
}
}
data.add(toSend.size());
for(ValveData valveData : toSend)
{ {
valveData.location.write(data); valveData.location.write(data);
data.add(valveData.side.ordinal()); data.add(valveData.side.ordinal());
data.add(valveData.serverFluid);
} }
} }
} }
@ -342,28 +368,16 @@ public class TileEntityDynamicTank extends TileEntityMultiblock<SynchronizedTank
if(isRendering) if(isRendering)
{ {
int size = dataStream.readInt(); int size = dataStream.readInt();
valveViewing.clear();
for(int i = 0; i < size; i++) for(int i = 0; i < size; i++)
{ {
ValveData data = new ValveData(); ValveData data = new ValveData();
data.location = Coord4D.read(dataStream); data.location = Coord4D.read(dataStream);
data.side = ForgeDirection.getOrientation(dataStream.readInt()); data.side = ForgeDirection.getOrientation(dataStream.readInt());
int viewingTicks = 0;
valveViewing.add(data);
if(dataStream.readBoolean())
{
viewingTicks = 30;
}
if(viewingTicks == 0)
{
if(valveViewing.containsKey(data) && valveViewing.get(data) > 0)
{
continue;
}
}
valveViewing.put(data, viewingTicks);
TileEntityDynamicTank tileEntity = (TileEntityDynamicTank)data.location.getTileEntity(worldObj); TileEntityDynamicTank tileEntity = (TileEntityDynamicTank)data.location.getTileEntity(worldObj);