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)
{
for(int i = 0; i < 6; i++)
{
//Update the tile entity on neighboring blocks
TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
if(tileEntity instanceof TileEntityPipe)
{
TileEntityPipe conductorTileEntity = (TileEntityPipe) tileEntity;
Liquid type = conductorTileEntity.getType();
ForgeDirection side = ForgeDirection.getOrientation(i);
conductorTileEntity.addConnection(getLiquidUnit(world, x, y, z, side, type), side);
((TileEntityPipe) tileEntity).addConnection(getLiquidUnit(world, x, y, z,
ForgeDirection.getOrientation(i), ((TileEntityPipe) tileEntity).getType()), ForgeDirection.getOrientation(i));
}
}
}
@ -107,6 +103,7 @@ public class BlockPipe extends BlockContainer
@Override
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);
Random furnaceRand = new Random();
if(ent instanceof TileEntityPipe)

View file

@ -66,7 +66,9 @@ public class ItemGuage extends Item
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;
}
if(blockEntity instanceof IMechanical)
@ -78,7 +80,7 @@ public class ItemGuage extends Item
print = " " + steam +"N "+pressure*45+"degrees";
player.addChatMessage(print);
player.sendChatToPlayer(print);
return true;
}
}

View file

@ -16,20 +16,20 @@ import basicpipes.pipes.api.Liquid;
import com.google.common.io.ByteArrayDataInput;
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;
//The maximum amount of electricity this conductor can take
public int capacity = 2;
public int hPressure = this.presure;
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 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
* @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;
}
}else
}
if(tileEntity instanceof ILiquidProducer)
{
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).
* @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
public void updateEntity()
{
if(++count >= 10 || firstUpdate)
{count = 0;firstUpdate = false;
if(++count >= 5)
{
this.connectedUnits = 0;
this.hPressure = 0;
this.hPProducer = 0;
count = 0;
BlockPipe.updateConductorTileEntity(this.worldObj, this.xCoord, this.yCoord, this.zCoord);
if(!this.worldObj.isRemote){
//update connections
//send packet with liquid type data
Packet packet = PacketManager.getPacket("Pipes",this, new Object[]{this.type.ordinal()});
PacketManager.sendPacketToClients(packet, worldObj, Vector3.get(this), 60);
int connectedUnits = 0;
int pipes = 1;
int producers = 0;
int averageVolume = this.liquidStored;
int aProducerPressure = 0;
if(!this.worldObj.isRemote)
{
if(firstUpdate)
{ firstUpdate = false;
Packet packet = PacketManager.getPacket("Pipes",this, new Object[]{this.type.ordinal()});
PacketManager.sendPacketToClients(packet, worldObj, Vector3.get(this), 60);
}
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)))
if(((ILiquidProducer)connectedBlocks[i]).canProducePresure(this.type, ForgeDirection.getOrientation(i)))
{++this.connectedUnits;
if(((ILiquidProducer)connectedBlocks[i]).presureOutput(this.type,ForgeDirection.getOrientation(i)) > hPProducer)
{
aProducerPressure += ((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;
hPProducer = ((ILiquidProducer)connectedBlocks[i]).presureOutput(this.type,ForgeDirection.getOrientation(i));
}
}
}
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
averageVolume = Math.max(averageVolume/pipes,0);
//sets the pressure of the pipe to the producer pressure or to the highest pipe pressure -1
if(producers > 0)
{
aProducerPressure = Math.max(aProducerPressure/producers,0);
this.presure = aProducerPressure;
}
else
}//end of pressure update
this.presure = 0;
if(connectedUnits > 0)
{
this.presure = hPressure - 1;
if(hPProducer > 0)
{
this.presure = hPProducer;
}else
{
this.presure = Math.max(hPressure - 1,0);
}
}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
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)
{
@ -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;
private int force = 0;
private int pForce = 0;
public int aForce = 0;
public int forceMax = 1000;
private int tickCount = 0;
@ -72,8 +73,12 @@ public class TileEntityRod extends TileEntity implements IPacketReceiver,IMechan
this.force -=Math.max(force/10, 0);
}
aForce = Math.max(force - 10,0);
Packet packet = PacketManager.getPacket(SteamPowerMain.channel,this, new Object[]{force,aForce});
PacketManager.sendPacketToClients(packet, worldObj, Vector3.get(this), 40);
if(this.force != this.pForce)
{
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
{
this.force = dataStream.readInt();
this.aForce = dataStream.readInt();
}catch(Exception e)
{
e.printStackTrace();

View file

@ -82,11 +82,15 @@ public class TileEntityMachine extends TileEntity implements IInventory, ISided
{
return new Object[]{};
}
public boolean needUpdate()
{
return false;
}
public void updateEntity()
{
super.updateEntity();
if(count ++ >= 20 && !worldObj.isRemote)
if(count ++ >= 10 && !worldObj.isRemote && needUpdate())
{count = 0;
Packet packet = PacketManager.getPacket(SteamPowerMain.channel,this, getSendData());
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 */
public int RunTime = 0;
/** The ammount of energy stored before being add to run Timer */
public int energyStore = 0;
/** The ammount of water stored */
public int waterStored = 0;
/** The ammount of steam stored */
@ -53,13 +51,16 @@ public class TileEntityBoiler extends TileEntityMachine implements IPacketReceiv
int steamMax = 140;
public boolean isBeingHeated = false;
private Random random = new Random();
private int pWater = 0;
private int pSteam = 0;
private int pHullH = 0;
public String getInvName()
{
return "container.boiler";
}
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};
}
@ -71,7 +72,6 @@ public class TileEntityBoiler extends TileEntityMachine implements IPacketReceiv
{
RunTime = dataStream.readInt();
energyStore = dataStream.readInt();
waterStored = dataStream.readInt();
steamStored = dataStream.readInt();
heatStored = dataStream.readInt();
@ -91,7 +91,6 @@ public class TileEntityBoiler extends TileEntityMachine implements IPacketReceiv
{
super.readFromNBT(par1NBTTagCompound);
this.RunTime = par1NBTTagCompound.getShort("BurnTime");
this.energyStore = par1NBTTagCompound.getInteger("energyStore");
this.steamStored = par1NBTTagCompound.getInteger("steamStore");
this.heatStored = par1NBTTagCompound.getInteger("heatStore");
this.waterStored = par1NBTTagCompound.getInteger("waterStore");
@ -105,7 +104,6 @@ public class TileEntityBoiler extends TileEntityMachine implements IPacketReceiv
{
super.writeToNBT(par1NBTTagCompound);
par1NBTTagCompound.setShort("BurnTime", (short)this.RunTime);
par1NBTTagCompound.setInteger("energyStore", (int)this.energyStore);
par1NBTTagCompound.setInteger("steamStore", (int)this.steamStored);
par1NBTTagCompound.setInteger("heatStore", (int)this.heatStored);
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
* 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
public void updateEntity()
{
super.updateEntity();
if(count++ >=20)
{
count = 0;
@ -183,8 +190,12 @@ public class TileEntityBoiler extends TileEntityMachine implements IPacketReceiv
{
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()
@ -309,15 +320,7 @@ public class TileEntityBoiler extends TileEntityMachine implements IPacketReceiv
public int presureOutput(Liquid type, ForgeDirection side) {
if(type == Liquid.STEAM)
{
if(side == ForgeDirection.UP)
{
return 100;
}
else
{
return 80;
}
return (this.steamStored/this.steamMax)*40 +60;
}
return 0;
}

View file

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

View file

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

View file

@ -41,7 +41,10 @@ public class TileEntitySteamPiston extends TileEntityMachine implements IPacketR
private ForgeDirection frontDir;
public TileEntity ff;
public TileEntity bb;
private int pWater = 0;
private int pSteam = 0;
private int pForce = 0;
public int pCount = 0;
public boolean running= false;
@Override
@ -51,7 +54,7 @@ public class TileEntitySteamPiston extends TileEntityMachine implements IPacketR
if(tickCount++ >=10)
{tickCount = 0;
++tCount;if(tCount > 120){tCount = 0;}
//++tCount;if(tCount > 120){tCount = 0;}
int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord);
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()
{
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
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.force = dataStream.readInt();
this.aForce = dataStream.readInt();
this.bForce = dataStream.readInt();
this.genRate= dataStream.readInt();
this.runTime = dataStream.readInt();
//System.out.print("Packet \n");
++pCount;
}
catch(Exception e)
{

View file

@ -61,14 +61,14 @@ import universalelectricity.electricity.ElectricInfo.ElectricUnit;
displayText2 = "water" + "-" + tileEntity.water;
displayText3 = "steam" + "-" + tileEntity.steam;
displayText4 = "Debug:Time" + "=" + tileEntity.tCount;
displayText5 = "Debug:bforce" + "=" + tileEntity.bForce;
displayText4 = "Db:PacketsReceived " + "=" + tileEntity.pCount;
//displayText5 = "Debug:bforce" + "=" + tileEntity.bForce;
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(displayText3, (int)(105-displayText.length()*1), 65, 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);
}