bug fixes and packet reductions

fixed another bug with the pipe, pipe would not lose pressure after
being disconncted from source. Also cleaned up a bit on some of the code
and added code to only send packets if the machine updated. This will
reduce a lot of paceket load being sent to the client.
This commit is contained in:
Rseifert 2012-10-08 14:24:34 -04:00
parent 89e5ca315b
commit 3bd9b857d4
10 changed files with 129 additions and 104 deletions

View file

@ -84,17 +84,13 @@ public class BlockPipe extends BlockContainer
} }
public static void updateConductorTileEntity(World world, int x, int y, int z) public static void updateConductorTileEntity(World world, int x, int y, int z)
{ {
for(int i = 0; i < 6; i++) for(int i = 0; i < 6; i++)
{ {
//Update the tile entity on neighboring blocks
TileEntity tileEntity = world.getBlockTileEntity(x, y, z); TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
if(tileEntity instanceof TileEntityPipe) if(tileEntity instanceof TileEntityPipe)
{ {
TileEntityPipe conductorTileEntity = (TileEntityPipe) tileEntity; ((TileEntityPipe) tileEntity).addConnection(getLiquidUnit(world, x, y, z,
Liquid type = conductorTileEntity.getType(); ForgeDirection.getOrientation(i), ((TileEntityPipe) tileEntity).getType()), ForgeDirection.getOrientation(i));
ForgeDirection side = ForgeDirection.getOrientation(i);
conductorTileEntity.addConnection(getLiquidUnit(world, x, y, z, side, type), side);
} }
} }
} }
@ -107,6 +103,7 @@ public class BlockPipe extends BlockContainer
@Override @Override
public void breakBlock(World world, int x, int y, int z,int par5, int par6) public void breakBlock(World world, int x, int y, int z,int par5, int par6)
{ {
super.breakBlock(world, x, y, z, par5, par6);
TileEntity ent = world.getBlockTileEntity(x, y, z); TileEntity ent = world.getBlockTileEntity(x, y, z);
Random furnaceRand = new Random(); Random furnaceRand = new Random();
if(ent instanceof TileEntityPipe) if(ent instanceof TileEntityPipe)

View file

@ -66,7 +66,9 @@ public class ItemGuage extends Item
print = typeName +" " + steam +" @ "+pressure+"PSI"; print = typeName +" " + steam +" @ "+pressure+"PSI";
player.addChatMessage(print); player.sendChatToPlayer(print);
player.sendChatToPlayer("hPre: "+pipeEntity.hPressure+" hPPre:"+pipeEntity.hPProducer);
player.sendChatToPlayer("cUnits: "+pipeEntity.connectedUnits);
return true; return true;
} }
if(blockEntity instanceof IMechanical) if(blockEntity instanceof IMechanical)
@ -78,7 +80,7 @@ public class ItemGuage extends Item
print = " " + steam +"N "+pressure*45+"degrees"; print = " " + steam +"N "+pressure*45+"degrees";
player.addChatMessage(print); player.sendChatToPlayer(print);
return true; return true;
} }
} }

View file

@ -16,20 +16,20 @@ import basicpipes.pipes.api.Liquid;
import com.google.common.io.ByteArrayDataInput; import com.google.common.io.ByteArrayDataInput;
public class TileEntityPipe extends TileEntity implements ILiquidConsumer,IPacketReceiver public class TileEntityPipe extends TileEntity implements ILiquidConsumer,IPacketReceiver
{ {
//The amount stored in the conductor
protected int liquidStored = 0;
//the current set type of the pipe 0-5
protected Liquid type = Liquid.DEFUALT; protected Liquid type = Liquid.DEFUALT;
//The maximum amount of electricity this conductor can take
public int capacity = 2; public int capacity = 2;
public int hPressure = this.presure;
private int count = 0; private int count = 0;
private boolean intiUpdate = true;
//Stores information on all connected blocks around this tile entity
public TileEntity[] connectedBlocks = {null, null, null, null, null, null};
//Checks if this is the first the tile entity updates
protected boolean firstUpdate = true;
public int presure = 0; public int presure = 0;
public int connectedUnits = 0;
public int hPressure = 0;
public int hPProducer = 0;
protected int liquidStored = 0;
private boolean intiUpdate = true;
protected boolean firstUpdate = true;
public TileEntity[] connectedBlocks = {null, null, null, null, null, null};
/** /**
* This function adds a connection between this pipe and other blocks * This function adds a connection between this pipe and other blocks
* @param tileEntity - Must be either a producer, consumer or a conductor * @param tileEntity - Must be either a producer, consumer or a conductor
@ -44,15 +44,19 @@ public class TileEntityPipe extends TileEntity implements ILiquidConsumer,IPacke
{ {
this.connectedBlocks[side.ordinal()] = tileEntity; this.connectedBlocks[side.ordinal()] = tileEntity;
} }
}else }
if(tileEntity instanceof ILiquidProducer) if(tileEntity instanceof ILiquidProducer)
{ {
if(((ILiquidProducer)tileEntity).canProduceLiquid(this.type, side)) if(((ILiquidProducer)tileEntity).canProduceLiquid(this.type, side))
{ {
this.connectedBlocks[side.ordinal()] = tileEntity; this.connectedBlocks[side.ordinal()] = tileEntity;
} }
} }
} }
public int getPressure()
{
return this.presure;
}
/** /**
* onRecieveLiquid is called whenever a something sends a volume to the pipe (which is this block). * onRecieveLiquid is called whenever a something sends a volume to the pipe (which is this block).
* @param vols - The amount of vol source is trying to give to this pipe * @param vols - The amount of vol source is trying to give to this pipe
@ -73,72 +77,64 @@ public class TileEntityPipe extends TileEntity implements ILiquidConsumer,IPacke
@Override @Override
public void updateEntity() public void updateEntity()
{ {
if(++count >= 10 || firstUpdate) if(++count >= 5)
{count = 0;firstUpdate = false; {
this.connectedUnits = 0;
this.hPressure = 0;
this.hPProducer = 0;
count = 0;
BlockPipe.updateConductorTileEntity(this.worldObj, this.xCoord, this.yCoord, this.zCoord); BlockPipe.updateConductorTileEntity(this.worldObj, this.xCoord, this.yCoord, this.zCoord);
if(!this.worldObj.isRemote){ if(!this.worldObj.isRemote)
//update connections {
if(firstUpdate)
//send packet with liquid type data { firstUpdate = false;
Packet packet = PacketManager.getPacket("Pipes",this, new Object[]{this.type.ordinal()}); Packet packet = PacketManager.getPacket("Pipes",this, new Object[]{this.type.ordinal()});
PacketManager.sendPacketToClients(packet, worldObj, Vector3.get(this), 60); PacketManager.sendPacketToClients(packet, worldObj, Vector3.get(this), 60);
}
int connectedUnits = 0;
int pipes = 1;
int producers = 0;
int averageVolume = this.liquidStored;
int aProducerPressure = 0;
for(int i = 0; i < 6; i++) for(int i = 0; i < 6; i++)
{ {
if(connectedBlocks[i] instanceof ILiquidConsumer || connectedBlocks[i] instanceof ILiquidProducer) if(connectedBlocks[i] instanceof ILiquidProducer)
{ {
connectedUnits ++;
if(connectedBlocks[i] instanceof ILiquidProducer) if(((ILiquidProducer)connectedBlocks[i]).canProducePresure(this.type, ForgeDirection.getOrientation(i)))
{ {++this.connectedUnits;
if(((ILiquidProducer)connectedBlocks[i]).canProducePresure(this.type, ForgeDirection.getOrientation(i))) if(((ILiquidProducer)connectedBlocks[i]).presureOutput(this.type,ForgeDirection.getOrientation(i)) > hPProducer)
{ {
aProducerPressure += ((ILiquidProducer)connectedBlocks[i]).presureOutput(this.type,ForgeDirection.getOrientation(i)); hPProducer = ((ILiquidProducer)connectedBlocks[i]).presureOutput(this.type,ForgeDirection.getOrientation(i));
producers++;
}
}
if(connectedBlocks[i] instanceof TileEntityPipe)
{
pipes ++;
//add pipes volume to average collection value
averageVolume += ((TileEntityPipe)connectedBlocks[i]).liquidStored;
//get the current pipes pressure
int pPressure = ((TileEntityPipe)connectedBlocks[i]).presure ;
if(pPressure > hPressure)
{
this.hPressure = pPressure;
} }
} }
}
if(connectedBlocks[i] instanceof TileEntityPipe)
{
++this.connectedUnits;
if(((TileEntityPipe)connectedBlocks[i]).presure > hPressure)
{
hPressure = ((TileEntityPipe)connectedBlocks[i]).getPressure();
}
} }
}
//turn average collection into actual average pipe volume }//end of pressure update
averageVolume = Math.max(averageVolume/pipes,0);
//sets the pressure of the pipe to the producer pressure or to the highest pipe pressure -1 this.presure = 0;
if(producers > 0)
{
aProducerPressure = Math.max(aProducerPressure/producers,0);
this.presure = aProducerPressure;
}
else
if(connectedUnits > 0) if(connectedUnits > 0)
{ {
this.presure = hPressure - 1; if(hPProducer > 0)
{
this.presure = hPProducer;
}else
{
this.presure = Math.max(hPressure - 1,0);
}
}else }else
{ {
this.presure = 1; this.presure = 0;
} }
//only trade liquid if there is more than one thing connect and its pressure is higher than 1 //only trade liquid if there is more than one thing connect and its pressure is higher than 1
if(connectedUnits > 0 && this.presure > 0) if(this.connectedUnits > 0 && this.presure > 0 && this.liquidStored > 0)
{ {
for(byte i = 0; i < 6; i++) for(int i = 0; i < 6; i++)
{ {
if(connectedBlocks[i] != null) if(connectedBlocks[i] != null)
{ {
@ -175,9 +171,9 @@ public class TileEntityPipe extends TileEntity implements ILiquidConsumer,IPacke
} }
} }
} }
} }//end of liquid trader
} }//end of !worldObj.isRemote
} }
} }

View file

@ -18,6 +18,7 @@ public class TileEntityRod extends TileEntity implements IPacketReceiver,IMechan
public int pos = 0; public int pos = 0;
private int force = 0; private int force = 0;
private int pForce = 0;
public int aForce = 0; public int aForce = 0;
public int forceMax = 1000; public int forceMax = 1000;
private int tickCount = 0; private int tickCount = 0;
@ -72,8 +73,12 @@ public class TileEntityRod extends TileEntity implements IPacketReceiver,IMechan
this.force -=Math.max(force/10, 0); this.force -=Math.max(force/10, 0);
} }
aForce = Math.max(force - 10,0); aForce = Math.max(force - 10,0);
Packet packet = PacketManager.getPacket(SteamPowerMain.channel,this, new Object[]{force,aForce}); if(this.force != this.pForce)
PacketManager.sendPacketToClients(packet, worldObj, Vector3.get(this), 40); {
Packet packet = PacketManager.getPacket(SteamPowerMain.channel,this, new Object[]{force});
PacketManager.sendPacketToClients(packet, worldObj, Vector3.get(this), 40);
}
this.pForce = this.force;
} }
} }
} }
@ -113,7 +118,6 @@ public class TileEntityRod extends TileEntity implements IPacketReceiver,IMechan
try try
{ {
this.force = dataStream.readInt(); this.force = dataStream.readInt();
this.aForce = dataStream.readInt();
}catch(Exception e) }catch(Exception e)
{ {
e.printStackTrace(); e.printStackTrace();

View file

@ -82,11 +82,15 @@ public class TileEntityMachine extends TileEntity implements IInventory, ISided
{ {
return new Object[]{}; return new Object[]{};
} }
public boolean needUpdate()
{
return false;
}
public void updateEntity() public void updateEntity()
{ {
super.updateEntity(); super.updateEntity();
if(count ++ >= 20 && !worldObj.isRemote) if(count ++ >= 10 && !worldObj.isRemote && needUpdate())
{count = 0; {count = 0;
Packet packet = PacketManager.getPacket(SteamPowerMain.channel,this, getSendData()); Packet packet = PacketManager.getPacket(SteamPowerMain.channel,this, getSendData());
PacketManager.sendPacketToClients(packet, worldObj, Vector3.get(this), 40); PacketManager.sendPacketToClients(packet, worldObj, Vector3.get(this), 40);

View file

@ -32,8 +32,6 @@ public class TileEntityBoiler extends TileEntityMachine implements IPacketReceiv
/** The number of ticks that the boiler will keep burning */ /** The number of ticks that the boiler will keep burning */
public int RunTime = 0; public int RunTime = 0;
/** The ammount of energy stored before being add to run Timer */
public int energyStore = 0;
/** The ammount of water stored */ /** The ammount of water stored */
public int waterStored = 0; public int waterStored = 0;
/** The ammount of steam stored */ /** The ammount of steam stored */
@ -53,13 +51,16 @@ public class TileEntityBoiler extends TileEntityMachine implements IPacketReceiv
int steamMax = 140; int steamMax = 140;
public boolean isBeingHeated = false; public boolean isBeingHeated = false;
private Random random = new Random(); private Random random = new Random();
private int pWater = 0;
private int pSteam = 0;
private int pHullH = 0;
public String getInvName() public String getInvName()
{ {
return "container.boiler"; return "container.boiler";
} }
public Object[] getSendData() public Object[] getSendData()
{ {
return new Object[]{(int)RunTime,(int)energyStore,(int)waterStored, return new Object[]{(int)RunTime,(int)waterStored,
(int)steamStored,(int)heatStored,(int)hullHeat,(int)heatTick}; (int)steamStored,(int)heatStored,(int)hullHeat,(int)heatTick};
} }
@ -71,7 +72,6 @@ public class TileEntityBoiler extends TileEntityMachine implements IPacketReceiv
{ {
RunTime = dataStream.readInt(); RunTime = dataStream.readInt();
energyStore = dataStream.readInt();
waterStored = dataStream.readInt(); waterStored = dataStream.readInt();
steamStored = dataStream.readInt(); steamStored = dataStream.readInt();
heatStored = dataStream.readInt(); heatStored = dataStream.readInt();
@ -91,7 +91,6 @@ public class TileEntityBoiler extends TileEntityMachine implements IPacketReceiv
{ {
super.readFromNBT(par1NBTTagCompound); super.readFromNBT(par1NBTTagCompound);
this.RunTime = par1NBTTagCompound.getShort("BurnTime"); this.RunTime = par1NBTTagCompound.getShort("BurnTime");
this.energyStore = par1NBTTagCompound.getInteger("energyStore");
this.steamStored = par1NBTTagCompound.getInteger("steamStore"); this.steamStored = par1NBTTagCompound.getInteger("steamStore");
this.heatStored = par1NBTTagCompound.getInteger("heatStore"); this.heatStored = par1NBTTagCompound.getInteger("heatStore");
this.waterStored = par1NBTTagCompound.getInteger("waterStore"); this.waterStored = par1NBTTagCompound.getInteger("waterStore");
@ -105,7 +104,6 @@ public class TileEntityBoiler extends TileEntityMachine implements IPacketReceiv
{ {
super.writeToNBT(par1NBTTagCompound); super.writeToNBT(par1NBTTagCompound);
par1NBTTagCompound.setShort("BurnTime", (short)this.RunTime); par1NBTTagCompound.setShort("BurnTime", (short)this.RunTime);
par1NBTTagCompound.setInteger("energyStore", (int)this.energyStore);
par1NBTTagCompound.setInteger("steamStore", (int)this.steamStored); par1NBTTagCompound.setInteger("steamStore", (int)this.steamStored);
par1NBTTagCompound.setInteger("heatStore", (int)this.heatStored); par1NBTTagCompound.setInteger("heatStore", (int)this.heatStored);
par1NBTTagCompound.setInteger("waterStore", (int)this.waterStored); par1NBTTagCompound.setInteger("waterStore", (int)this.waterStored);
@ -115,10 +113,19 @@ public class TileEntityBoiler extends TileEntityMachine implements IPacketReceiv
/** /**
* Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count
* ticks and creates a new spawn inside its implementation. * ticks and creates a new spawn inside its implementation.
*/ */
public boolean needUpdate()
{
if(this.pWater != this.waterStored || this.pSteam != this.steamStored || this.pHullH != this.hullHeat)
{
return true;
}
return false;
}
@Override @Override
public void updateEntity() public void updateEntity()
{ {
super.updateEntity();
if(count++ >=20) if(count++ >=20)
{ {
count = 0; count = 0;
@ -183,8 +190,12 @@ public class TileEntityBoiler extends TileEntityMachine implements IPacketReceiv
{ {
heatStored += (int) Math.min((int)(random.nextDouble()*100), heatMax); heatStored += (int) Math.min((int)(random.nextDouble()*100), heatMax);
} }
//keeps track of what the previous measure were so packets stop sending after the machine doesn't change any
this.pWater = this.waterStored;
this.pSteam = this.steamStored;
this.pHullH = this.hullHeat;
} }
super.updateEntity();
} }
} }
private void emptyBuckets() private void emptyBuckets()
@ -309,15 +320,7 @@ public class TileEntityBoiler extends TileEntityMachine implements IPacketReceiv
public int presureOutput(Liquid type, ForgeDirection side) { public int presureOutput(Liquid type, ForgeDirection side) {
if(type == Liquid.STEAM) if(type == Liquid.STEAM)
{ {
if(side == ForgeDirection.UP) return (this.steamStored/this.steamMax)*40 +60;
{
return 100;
}
else
{
return 80;
}
} }
return 0; return 0;
} }

View file

@ -40,6 +40,10 @@ public class TileEntityFireBox extends TileEntityMachine implements IPacketRecei
return 5; return 5;
} }
public boolean needUpdate()
{
return true;
}
public void updateEntity() public void updateEntity()
{ {
super.updateEntity(); super.updateEntity();

View file

@ -28,7 +28,10 @@ public class TileEntityGen extends TileEntityMachine implements IPacketReceiver,
public boolean empProf = false; public boolean empProf = false;
IConductor[] wires = {null,null,null,null,null,null}; IConductor[] wires = {null,null,null,null,null,null};
public boolean needUpdate()
{
return false;
}
@Override @Override
public void updateEntity() public void updateEntity()
{ {

View file

@ -41,7 +41,10 @@ public class TileEntitySteamPiston extends TileEntityMachine implements IPacketR
private ForgeDirection frontDir; private ForgeDirection frontDir;
public TileEntity ff; public TileEntity ff;
public TileEntity bb; public TileEntity bb;
private int pWater = 0;
private int pSteam = 0;
private int pForce = 0;
public int pCount = 0;
public boolean running= false; public boolean running= false;
@Override @Override
@ -51,7 +54,7 @@ public class TileEntitySteamPiston extends TileEntityMachine implements IPacketR
if(tickCount++ >=10) if(tickCount++ >=10)
{tickCount = 0; {tickCount = 0;
++tCount;if(tCount > 120){tCount = 0;} //++tCount;if(tCount > 120){tCount = 0;}
int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord);
int nMeta = 0; int nMeta = 0;
@ -130,7 +133,9 @@ public class TileEntitySteamPiston extends TileEntityMachine implements IPacketR
} }
} }
pWater = this.water;
pSteam = this.steam;
pForce = this.force;
} }
@ -260,7 +265,15 @@ public class TileEntitySteamPiston extends TileEntityMachine implements IPacketR
//---------------- //----------------
public Object[] getSendData() public Object[] getSendData()
{ {
return new Object[]{steam,water,force,aForce,bForce,genRate,runTime}; return new Object[]{steam,water,force,aForce,genRate,runTime};
}
public boolean needUpdate()
{
if(this.pForce != this.force || this.pWater != this.water || this.pSteam != this.steam)
{
return true;
}
return false;
} }
@Override @Override
public void handlePacketData(NetworkManager network,Packet250CustomPayload packet, EntityPlayer player,ByteArrayDataInput dataStream) { public void handlePacketData(NetworkManager network,Packet250CustomPayload packet, EntityPlayer player,ByteArrayDataInput dataStream) {
@ -270,10 +283,9 @@ public class TileEntitySteamPiston extends TileEntityMachine implements IPacketR
this.water = dataStream.readInt(); this.water = dataStream.readInt();
this.force = dataStream.readInt(); this.force = dataStream.readInt();
this.aForce = dataStream.readInt(); this.aForce = dataStream.readInt();
this.bForce = dataStream.readInt();
this.genRate= dataStream.readInt(); this.genRate= dataStream.readInt();
this.runTime = dataStream.readInt(); this.runTime = dataStream.readInt();
//System.out.print("Packet \n"); ++pCount;
} }
catch(Exception e) catch(Exception e)
{ {

View file

@ -61,14 +61,14 @@ import universalelectricity.electricity.ElectricInfo.ElectricUnit;
displayText2 = "water" + "-" + tileEntity.water; displayText2 = "water" + "-" + tileEntity.water;
displayText3 = "steam" + "-" + tileEntity.steam; displayText3 = "steam" + "-" + tileEntity.steam;
displayText4 = "Debug:Time" + "=" + tileEntity.tCount; displayText4 = "Db:PacketsReceived " + "=" + tileEntity.pCount;
displayText5 = "Debug:bforce" + "=" + tileEntity.bForce; //displayText5 = "Debug:bforce" + "=" + tileEntity.bForce;
this.fontRenderer.drawString(displayText, (int)(105-displayText.length()*1), 45, 4210752); this.fontRenderer.drawString(displayText, (int)(105-displayText.length()*1), 45, 4210752);
this.fontRenderer.drawString(displayText2, (int)(105-displayText.length()*1), 55, 4210752); this.fontRenderer.drawString(displayText2, (int)(105-displayText.length()*1), 55, 4210752);
this.fontRenderer.drawString(displayText3, (int)(105-displayText.length()*1), 65, 4210752); this.fontRenderer.drawString(displayText3, (int)(105-displayText.length()*1), 65, 4210752);
this.fontRenderer.drawString(displayText4, (int)(105-displayText.length()*1), 75, 4210752); this.fontRenderer.drawString(displayText4, (int)(105-displayText.length()*1), 75, 4210752);
this.fontRenderer.drawString(displayText5, (int)(105-displayText.length()*1), 85, 4210752); // this.fontRenderer.drawString(displayText5, (int)(105-displayText.length()*1), 85, 4210752);
this.fontRenderer.drawString(StatCollector.translateToLocal("container.inventory"), 8, this.ySize - 96 + 2, 4210752); this.fontRenderer.drawString(StatCollector.translateToLocal("container.inventory"), 8, this.ySize - 96 + 2, 4210752);
} }