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,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();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue