From ce3d891eaaea0b91eef264f9b136b3aac1bcae81 Mon Sep 17 00:00:00 2001 From: mezz Date: Tue, 24 Mar 2015 23:02:48 -0700 Subject: [PATCH] #561 Use less network data for saplings --- .../PacketHandlerArboriculture.java | 25 +++++-- .../arboriculture/gadgets/TileLeaves.java | 45 +++-------- .../arboriculture/gadgets/TileSapling.java | 34 +++++++++ .../gadgets/TileTreeContainer.java | 20 +---- ...{PacketLeafUpdate.java => PacketLeaf.java} | 70 +++++++---------- .../arboriculture/network/PacketSapling.java | 16 ++++ .../network/PacketTreeContainer.java | 75 +++++++++++++++++++ .../java/forestry/core/network/PacketIds.java | 3 +- 8 files changed, 189 insertions(+), 99 deletions(-) rename src/main/java/forestry/arboriculture/network/{PacketLeafUpdate.java => PacketLeaf.java} (66%) mode change 100755 => 100644 create mode 100644 src/main/java/forestry/arboriculture/network/PacketSapling.java create mode 100644 src/main/java/forestry/arboriculture/network/PacketTreeContainer.java diff --git a/src/main/java/forestry/arboriculture/PacketHandlerArboriculture.java b/src/main/java/forestry/arboriculture/PacketHandlerArboriculture.java index 220d7fbe7..186668e9b 100755 --- a/src/main/java/forestry/arboriculture/PacketHandlerArboriculture.java +++ b/src/main/java/forestry/arboriculture/PacketHandlerArboriculture.java @@ -17,8 +17,10 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import forestry.arboriculture.gadgets.TileLeaves; -import forestry.arboriculture.network.PacketLeafUpdate; +import forestry.arboriculture.gadgets.TileSapling; +import forestry.arboriculture.network.PacketLeaf; import forestry.arboriculture.network.PacketRipeningUpdate; +import forestry.arboriculture.network.PacketSapling; import forestry.core.interfaces.IPacketHandler; import forestry.core.network.PacketIds; import forestry.core.proxy.Proxies; @@ -29,10 +31,16 @@ public class PacketHandlerArboriculture implements IPacketHandler { public boolean onPacketData(int packetID, DataInputStream data, EntityPlayer player) throws IOException { switch (packetID) { - case PacketIds.LEAF_UPDATE: { - PacketLeafUpdate packet = new PacketLeafUpdate(); + case PacketIds.SAPLING: { + PacketSapling packet = new PacketSapling(); packet.readData(data); - onLeafUpdate(packet); + onSaplingPacket(packet); + return true; + } + case PacketIds.LEAF: { + PacketLeaf packet = new PacketLeaf(); + packet.readData(data); + onLeafPacket(packet); return true; } case PacketIds.RIPENING_UPDATE: { @@ -46,7 +54,14 @@ public class PacketHandlerArboriculture implements IPacketHandler { return false; } - private void onLeafUpdate(PacketLeafUpdate packet) { + private void onSaplingPacket(PacketSapling packet) { + TileEntity tile = packet.getTarget(Proxies.common.getRenderWorld()); + if (tile instanceof TileSapling) { + ((TileSapling) tile).fromPacket(packet); + } + } + + private void onLeafPacket(PacketLeaf packet) { TileEntity tile = packet.getTarget(Proxies.common.getRenderWorld()); if (tile instanceof TileLeaves) { diff --git a/src/main/java/forestry/arboriculture/gadgets/TileLeaves.java b/src/main/java/forestry/arboriculture/gadgets/TileLeaves.java index 5b5682ac0..881fbc3ca 100755 --- a/src/main/java/forestry/arboriculture/gadgets/TileLeaves.java +++ b/src/main/java/forestry/arboriculture/gadgets/TileLeaves.java @@ -31,7 +31,6 @@ import net.minecraftforge.common.EnumPlantType; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import forestry.api.arboriculture.EnumTreeChromosome; import forestry.api.arboriculture.IAlleleTreeSpecies; import forestry.api.arboriculture.IFruitProvider; import forestry.api.arboriculture.ILeafTickHandler; @@ -42,7 +41,6 @@ import forestry.api.core.EnumHumidity; import forestry.api.core.EnumTemperature; import forestry.api.core.IErrorState; import forestry.api.genetics.AlleleManager; -import forestry.api.genetics.IAllele; import forestry.api.genetics.IEffectData; import forestry.api.genetics.IFruitBearer; import forestry.api.genetics.IFruitFamily; @@ -52,7 +50,7 @@ import forestry.api.lepidopterology.IButterfly; import forestry.api.lepidopterology.IButterflyGenome; import forestry.api.lepidopterology.IButterflyNursery; import forestry.api.lepidopterology.IButterflyRoot; -import forestry.arboriculture.network.PacketLeafUpdate; +import forestry.arboriculture.network.PacketLeaf; import forestry.arboriculture.network.PacketRipeningUpdate; import forestry.core.EnumErrorCode; import forestry.core.genetics.Allele; @@ -182,29 +180,6 @@ public class TileLeaves extends TileTreeContainer implements IPollinatable, IFru effectData = tree.doEffect(effectData, worldObj, biome.biomeID, xCoord, yCoord, zCoord); } - public void setTree(String speciesUID, boolean isPollinatedState, String fruitAlleleUID) { - ITree tree = getTree(); - if (tree != null && tree.getIdent().equals(speciesUID)) { - return; - } - - IAllele[] treeTemplate = PluginArboriculture.treeInterface.getTemplate(speciesUID); - if (treeTemplate != null) { - if (fruitAlleleUID != null) { - IAllele fruitAllele = AlleleManager.alleleRegistry.getAllele(fruitAlleleUID); - if (fruitAllele != null) { - treeTemplate[EnumTreeChromosome.FRUITS.ordinal()] = fruitAllele; - } - } - - ITree newTree = PluginArboriculture.treeInterface.templateAsIndividual(treeTemplate); - if (isPollinatedState) { - newTree.mate(newTree); - } - setTree(newTree); - } - } - @Override public void setTree(ITree tree) { super.setTree(tree); @@ -353,13 +328,13 @@ public class TileLeaves extends TileTreeContainer implements IPollinatable, IFru /* NETWORK */ @Override public Packet getDescriptionPacket() { - return new PacketLeafUpdate(this).getPacket(); + return new PacketLeaf(this).getPacket(); } @Override public void sendNetworkUpdate() { - PacketLeafUpdate leafUpdate = new PacketLeafUpdate(this); - Proxies.net.sendNetworkPacket(leafUpdate, xCoord, yCoord, zCoord); + PacketLeaf packet = new PacketLeaf(this); + Proxies.net.sendNetworkPacket(packet, xCoord, yCoord, zCoord); } private void sendNetworkUpdateRipening() { @@ -375,16 +350,20 @@ public class TileLeaves extends TileTreeContainer implements IPollinatable, IFru @Override public void fromPacket(ForestryPacket packetRaw) { - PacketLeafUpdate packet = (PacketLeafUpdate) packetRaw; + PacketLeaf packet = (PacketLeaf) packetRaw; isFruitLeaf = packet.isFruitLeaf(); isPollinatedState = packet.isPollinated(); colourFruits = packet.getColourFruits(); - String fruitAlleleUID = packet.getFruitAlleleUID(); - String speciesUID = packet.getSpeciesUID(); - setTree(speciesUID, isPollinatedState, fruitAlleleUID); + ITree tree = getTree(); + if (!packet.matchesTree(tree)) { + ITree newTree = packet.getTree(); + if (newTree != null) { + setTree(newTree); + } + } worldObj.func_147479_m(xCoord, yCoord, zCoord); } diff --git a/src/main/java/forestry/arboriculture/gadgets/TileSapling.java b/src/main/java/forestry/arboriculture/gadgets/TileSapling.java index e9b24e796..e2953144f 100755 --- a/src/main/java/forestry/arboriculture/gadgets/TileSapling.java +++ b/src/main/java/forestry/arboriculture/gadgets/TileSapling.java @@ -11,8 +11,13 @@ package forestry.arboriculture.gadgets; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.Packet; import net.minecraft.world.gen.feature.WorldGenerator; +import forestry.api.arboriculture.ITree; +import forestry.arboriculture.network.PacketSapling; +import forestry.core.network.ForestryPacket; +import forestry.core.proxy.Proxies; import forestry.plugins.PluginArboriculture; public class TileSapling extends TileTreeContainer { @@ -69,4 +74,33 @@ public class TileSapling extends TileTreeContainer { return 3; } + @Override + public Packet getDescriptionPacket() { + return new PacketSapling(this).getPacket(); + } + + @Override + public void sendNetworkUpdate() { + PacketSapling saplingPacket = new PacketSapling(this); + Proxies.net.sendNetworkPacket(saplingPacket, xCoord, yCoord, zCoord); + } + + @Override + public void fromPacket(ForestryPacket packetRaw) { + PacketSapling packet = (PacketSapling) packetRaw; + + ITree tree = getTree(); + if (packet.matchesTree(tree)) { + return; + } + + ITree newTree = packet.getTree(); + if (newTree == null) { + return; + } + + setTree(newTree); + worldObj.func_147479_m(xCoord, yCoord, zCoord); + } + } diff --git a/src/main/java/forestry/arboriculture/gadgets/TileTreeContainer.java b/src/main/java/forestry/arboriculture/gadgets/TileTreeContainer.java index 1ba767008..242c93523 100755 --- a/src/main/java/forestry/arboriculture/gadgets/TileTreeContainer.java +++ b/src/main/java/forestry/arboriculture/gadgets/TileTreeContainer.java @@ -21,11 +21,7 @@ import com.mojang.authlib.GameProfile; import forestry.api.arboriculture.ITree; import forestry.arboriculture.genetics.Tree; import forestry.core.interfaces.IOwnable; -import forestry.core.network.ForestryPacket; import forestry.core.network.INetworkedEntity; -import forestry.core.network.PacketIds; -import forestry.core.network.PacketTileNBT; -import forestry.core.proxy.Proxies; import forestry.core.utils.PlayerUtil; /** @@ -96,21 +92,7 @@ public abstract class TileTreeContainer extends TileEntity implements INetworked /* INETWORKEDENTITY */ @Override - public Packet getDescriptionPacket() { - return new PacketTileNBT(PacketIds.TILE_NBT, this).getPacket(); - } - - @Override - public void sendNetworkUpdate() { - Proxies.net.sendNetworkPacket(new PacketTileNBT(PacketIds.TILE_NBT, this), xCoord, yCoord, zCoord); - } - - @Override - public void fromPacket(ForestryPacket packetRaw) { - PacketTileNBT packet = (PacketTileNBT) packetRaw; - this.readFromNBT(packet.getTagCompound()); - worldObj.func_147479_m(xCoord, yCoord, zCoord); - } + public abstract Packet getDescriptionPacket(); /* IOWNABLE */ public GameProfile owner = null; diff --git a/src/main/java/forestry/arboriculture/network/PacketLeafUpdate.java b/src/main/java/forestry/arboriculture/network/PacketLeaf.java old mode 100755 new mode 100644 similarity index 66% rename from src/main/java/forestry/arboriculture/network/PacketLeafUpdate.java rename to src/main/java/forestry/arboriculture/network/PacketLeaf.java index 2d94c7b0a..1e85d6f15 --- a/src/main/java/forestry/arboriculture/network/PacketLeafUpdate.java +++ b/src/main/java/forestry/arboriculture/network/PacketLeaf.java @@ -14,39 +14,30 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - import forestry.api.arboriculture.EnumTreeChromosome; import forestry.api.arboriculture.ITree; +import forestry.api.genetics.AlleleManager; +import forestry.api.genetics.IAllele; import forestry.arboriculture.gadgets.TileLeaves; -import forestry.core.network.ForestryPacket; -import forestry.core.network.ILocatedPacket; import forestry.core.network.PacketIds; +import forestry.plugins.PluginArboriculture; -public class PacketLeafUpdate extends ForestryPacket implements ILocatedPacket { +public class PacketLeaf extends PacketTreeContainer { private static final short hasFruitFlag = 1; private static final short isPollinatedFlag = 1 << 1; - private int posX, posY, posZ; - private byte leafState = 0; private int colourFruits = -1; private String fruitAlleleUID; - private String speciesUID = ""; - - public PacketLeafUpdate() { + + public PacketLeaf() { + } - public PacketLeafUpdate(TileLeaves leaves) { - super(PacketIds.LEAF_UPDATE); + public PacketLeaf(TileLeaves leaves) { + super(PacketIds.LEAF, leaves); - posX = leaves.getXCoord(); - posY = leaves.getYCoord(); - posZ = leaves.getZCoord(); - - leafState = 0; if (leaves.hasFruit()) { leafState |= hasFruitFlag; fruitAlleleUID = leaves.getTree().getGenome().getActiveAllele(EnumTreeChromosome.FRUITS).getUID(); @@ -55,20 +46,12 @@ public class PacketLeafUpdate extends ForestryPacket implements ILocatedPacket { if (leaves.isPollinated()) { leafState |= isPollinatedFlag; } - - ITree tree = leaves.getTree(); - if (tree != null) { - speciesUID = tree.getIdent(); - } } @Override public void writeData(DataOutputStream data) throws IOException { - data.writeShort(posX); - data.writeShort(posY); - data.writeShort(posZ); + super.writeData(data); data.writeByte(leafState); - data.writeUTF(speciesUID); if (isFruitLeaf()) { data.writeUTF(fruitAlleleUID); @@ -78,11 +61,8 @@ public class PacketLeafUpdate extends ForestryPacket implements ILocatedPacket { @Override public void readData(DataInputStream data) throws IOException { - posX = data.readShort(); - posY = data.readShort(); - posZ = data.readShort(); + super.readData(data); leafState = data.readByte(); - speciesUID = data.readUTF(); if (isFruitLeaf()) { fruitAlleleUID = data.readUTF(); @@ -98,20 +78,28 @@ public class PacketLeafUpdate extends ForestryPacket implements ILocatedPacket { return (leafState & isPollinatedFlag) > 0; } - public String getFruitAlleleUID() { - return fruitAlleleUID; - } - public int getColourFruits() { return colourFruits; } - public String getSpeciesUID() { - return speciesUID; - } - @Override - public TileEntity getTarget(World world) { - return world.getTileEntity(posX, posY, posZ); + public ITree getTree() { + IAllele[] treeTemplate = PluginArboriculture.treeInterface.getTemplate(speciesUID); + if (treeTemplate == null) { + return null; + } + + if (fruitAlleleUID != null) { + IAllele fruitAllele = AlleleManager.alleleRegistry.getAllele(fruitAlleleUID); + if (fruitAllele != null) { + treeTemplate[EnumTreeChromosome.FRUITS.ordinal()] = fruitAllele; + } + } + + ITree tree = PluginArboriculture.treeInterface.templateAsIndividual(treeTemplate); + if (isPollinated()) { + tree.mate(tree); + } + return tree; } } diff --git a/src/main/java/forestry/arboriculture/network/PacketSapling.java b/src/main/java/forestry/arboriculture/network/PacketSapling.java new file mode 100644 index 000000000..71a50964d --- /dev/null +++ b/src/main/java/forestry/arboriculture/network/PacketSapling.java @@ -0,0 +1,16 @@ +package forestry.arboriculture.network; + +import forestry.arboriculture.gadgets.TileSapling; +import forestry.core.network.PacketIds; + +public class PacketSapling extends PacketTreeContainer { + + public PacketSapling() { + + } + + public PacketSapling(TileSapling sapling) { + super(PacketIds.SAPLING, sapling); + } + +} diff --git a/src/main/java/forestry/arboriculture/network/PacketTreeContainer.java b/src/main/java/forestry/arboriculture/network/PacketTreeContainer.java new file mode 100644 index 000000000..4fdd2a79a --- /dev/null +++ b/src/main/java/forestry/arboriculture/network/PacketTreeContainer.java @@ -0,0 +1,75 @@ +package forestry.arboriculture.network; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import forestry.api.arboriculture.ITree; +import forestry.api.genetics.IAllele; +import forestry.arboriculture.gadgets.TileTreeContainer; +import forestry.core.network.ForestryPacket; +import forestry.core.network.ILocatedPacket; +import forestry.plugins.PluginArboriculture; + +public class PacketTreeContainer extends ForestryPacket implements ILocatedPacket { + + private int posX, posY, posZ; + protected String speciesUID = ""; + + public PacketTreeContainer() { + + } + + public PacketTreeContainer(int id, TileTreeContainer treeContainer) { + super(id); + + posX = treeContainer.xCoord; + posY = treeContainer.yCoord; + posZ = treeContainer.zCoord; + + ITree tree = treeContainer.getTree(); + if (tree != null) { + speciesUID = tree.getIdent(); + } + } + + @Override + public void writeData(DataOutputStream data) throws IOException { + data.writeShort(posX); + data.writeShort(posY); + data.writeShort(posZ); + data.writeUTF(speciesUID); + } + + @Override + public void readData(DataInputStream data) throws IOException { + posX = data.readShort(); + posY = data.readShort(); + posZ = data.readShort(); + speciesUID = data.readUTF(); + } + + @Override + public TileEntity getTarget(World world) { + return world.getTileEntity(posX, posY, posZ); + } + + public boolean matchesTree(ITree tree) { + if (tree == null) { + return speciesUID.isEmpty(); + } else { + return tree.getIdent().equals(speciesUID); + } + } + + public ITree getTree() { + IAllele[] treeTemplate = PluginArboriculture.treeInterface.getTemplate(speciesUID); + if (treeTemplate != null) { + return PluginArboriculture.treeInterface.templateAsIndividual(treeTemplate); + } + return null; + } +} diff --git a/src/main/java/forestry/core/network/PacketIds.java b/src/main/java/forestry/core/network/PacketIds.java index be87128d2..2e6a1ddb2 100755 --- a/src/main/java/forestry/core/network/PacketIds.java +++ b/src/main/java/forestry/core/network/PacketIds.java @@ -46,7 +46,8 @@ public class PacketIds { public static final int POBOX_INFO = 85; public static final int POBOX_INFO_REQUEST = 86; - public static final int LEAF_UPDATE = 90; + public static final int SAPLING = 89; + public static final int LEAF = 90; public static final int RIPENING_UPDATE = 91; public static final int GUI_INTEGER = 92;