From 9577c53313965d0d4af741da6f1bfc5fb08f0389 Mon Sep 17 00:00:00 2001 From: SpaceToad Date: Sun, 22 Jun 2014 11:49:59 +0200 Subject: [PATCH] Fixed gate extension ids synchronization, for #1895. Added a new concept of NetworkId, allowing to transfer ids over the network instead of strings. RPCs are now all handled the same way (except RPC Pipes, to be completed when actually used). --- api/buildcraft/api/gates/GateExpansions.java | 27 --- common/buildcraft/BuildCraftCore.java | 3 + .../builders/TileAbstractBuilder.java | 2 +- common/buildcraft/builders/TileArchitect.java | 2 +- common/buildcraft/builders/TileBuilder.java | 6 +- .../network/BuildCraftChannelHandler.java | 23 ++- .../core/network/NetworkIdRegistry.java | 160 ++++++++++++++++++ .../core/network/PacketHandler.java | 16 +- common/buildcraft/core/network/PacketIds.java | 5 +- common/buildcraft/core/network/PacketRPC.java | 21 +++ .../core/network/PacketRPCEntity.java | 6 +- .../buildcraft/core/network/PacketRPCGui.java | 8 +- .../core/network/PacketRPCStatic.java | 56 ++++++ .../core/network/PacketRPCTile.java | 10 +- .../buildcraft/core/network/RPCHandler.java | 74 +++++--- .../network/serializers/ClassMapping.java | 44 +---- .../core/network/serializers/NetworkId.java | 13 ++ .../serializers/SerializationContext.java | 7 +- .../network/serializers/SerializerObject.java | 36 +--- .../buildcraft/core/robots/EntityRobot.java | 4 +- .../buildcraft/energy/TileEnergyEmitter.java | 8 +- .../buildcraft/transport/gates/ItemGate.java | 6 +- .../network/PacketGateExpansionMap.java | 54 ------ .../network/PacketHandlerTransport.java | 4 - .../tests/testcase/TileTestCase.java | 4 +- 25 files changed, 354 insertions(+), 245 deletions(-) create mode 100755 common/buildcraft/core/network/NetworkIdRegistry.java create mode 100755 common/buildcraft/core/network/PacketRPC.java create mode 100755 common/buildcraft/core/network/PacketRPCStatic.java create mode 100755 common/buildcraft/core/network/serializers/NetworkId.java delete mode 100644 common/buildcraft/transport/network/PacketGateExpansionMap.java diff --git a/api/buildcraft/api/gates/GateExpansions.java b/api/buildcraft/api/gates/GateExpansions.java index 4800a7fc..553ec959 100644 --- a/api/buildcraft/api/gates/GateExpansions.java +++ b/api/buildcraft/api/gates/GateExpansions.java @@ -13,14 +13,9 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; - public final class GateExpansions { private static final Map expansions = new HashMap(); - private static final BiMap serverIDMap = HashBiMap.create(); - private static final BiMap clientIDMap = HashBiMap.create(); private static byte nextID = 0; private GateExpansions() { @@ -32,37 +27,15 @@ public final class GateExpansions { public static void registerExpansion(String identifier, IGateExpansion expansion) { expansions.put(identifier, expansion); - serverIDMap.put(nextID++, identifier); } public static IGateExpansion getExpansion(String identifier) { return expansions.get(identifier); } - public static IGateExpansion getExpansionClient(int id) { - if (id < 0 || id >= 128) { - return null; - } else { - return expansions.get(clientIDMap.get((byte) id)); - } - } - - public static byte getServerExpansionID(String identifier) { - return serverIDMap.inverse().get(identifier); - } - public static Set getExpansions() { Set set = new HashSet(); set.addAll(expansions.values()); return set; } - - public static BiMap getServerMap() { - return serverIDMap; - } - - public static void setClientMap(BiMap map) { - clientIDMap.clear(); - clientIDMap.putAll(map); - } } diff --git a/common/buildcraft/BuildCraftCore.java b/common/buildcraft/BuildCraftCore.java index 9b9fe363..3216caf2 100644 --- a/common/buildcraft/BuildCraftCore.java +++ b/common/buildcraft/BuildCraftCore.java @@ -82,6 +82,7 @@ import buildcraft.core.TickHandlerCoreClient; import buildcraft.core.Version; import buildcraft.core.network.BuildCraftChannelHandler; import buildcraft.core.network.EntityIds; +import buildcraft.core.network.NetworkIdRegistry; import buildcraft.core.network.PacketHandler; import buildcraft.core.network.PacketUpdate; import buildcraft.core.proxy.CoreProxy; @@ -312,6 +313,8 @@ public class BuildCraftCore extends BuildCraftMod { channels = NetworkRegistry.INSTANCE.newChannel (DefaultProps.NET_CHANNEL_NAME + "-CORE", new BuildCraftChannelHandler(), new PacketHandler()); + NetworkIdRegistry.instance = new NetworkIdRegistry(); + StatementManager.registerTriggerProvider(new DefaultTriggerProvider()); StatementManager.registerActionProvider(new DefaultActionProvider()); diff --git a/common/buildcraft/builders/TileAbstractBuilder.java b/common/buildcraft/builders/TileAbstractBuilder.java index 11f0c579..77b29262 100755 --- a/common/buildcraft/builders/TileAbstractBuilder.java +++ b/common/buildcraft/builders/TileAbstractBuilder.java @@ -124,7 +124,7 @@ public abstract class TileAbstractBuilder extends TileBuildCraft implements ITil public void addBuildingItem(BuildingItem item) { buildersInAction.add(item); - RPCHandler.rpcBroadcastPlayers(worldObj, this, "launchItem", item); + RPCHandler.rpcBroadcastWorldPlayers(worldObj, this, "launchItem", item); } public final double energyAvailable() { diff --git a/common/buildcraft/builders/TileArchitect.java b/common/buildcraft/builders/TileArchitect.java index d70a1397..03114a7e 100644 --- a/common/buildcraft/builders/TileArchitect.java +++ b/common/buildcraft/builders/TileArchitect.java @@ -146,7 +146,7 @@ public class TileArchitect extends TileBuildCraft implements IInventory, IBoxPro @RPC (RPCSide.SERVER) public void handleClientSetName(String nameSet) { name = nameSet; - RPCHandler.rpcBroadcastPlayers(worldObj, this, "setName", name); + RPCHandler.rpcBroadcastWorldPlayers(worldObj, this, "setName", name); } @RPC diff --git a/common/buildcraft/builders/TileBuilder.java b/common/buildcraft/builders/TileBuilder.java index 91ad62e6..bf40b0cd 100644 --- a/common/buildcraft/builders/TileBuilder.java +++ b/common/buildcraft/builders/TileBuilder.java @@ -447,7 +447,7 @@ public class TileBuilder extends TileAbstractBuilder implements IMachine, IFluid if (!worldObj.isRemote) { if (i == 0) { - RPCHandler.rpcBroadcastPlayers(worldObj, this, "setItemRequirements", + RPCHandler.rpcBroadcastWorldPlayers(worldObj, this, "setItemRequirements", null, null); iterateBpt(false); } @@ -726,10 +726,10 @@ public class TileBuilder extends TileAbstractBuilder implements IMachine, IFluid stack.stackSize = 0; } - RPCHandler.rpcBroadcastPlayers(worldObj, this, "setItemRequirements", + RPCHandler.rpcBroadcastWorldPlayers(worldObj, this, "setItemRequirements", ((BptBuilderBlueprint) bluePrintBuilder).neededItems, realSize); } else { - RPCHandler.rpcBroadcastPlayers(worldObj, this, "setItemRequirements", null, null); + RPCHandler.rpcBroadcastWorldPlayers(worldObj, this, "setItemRequirements", null, null); } } diff --git a/common/buildcraft/core/network/BuildCraftChannelHandler.java b/common/buildcraft/core/network/BuildCraftChannelHandler.java index ec8617ac..4d0fff2f 100755 --- a/common/buildcraft/core/network/BuildCraftChannelHandler.java +++ b/common/buildcraft/core/network/BuildCraftChannelHandler.java @@ -14,7 +14,6 @@ import io.netty.channel.ChannelHandlerContext; import cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec; import buildcraft.transport.network.PacketFluidUpdate; -import buildcraft.transport.network.PacketGateExpansionMap; import buildcraft.transport.network.PacketPipeTransportItemStack; import buildcraft.transport.network.PacketPipeTransportItemStackRequest; import buildcraft.transport.network.PacketPipeTransportTraveler; @@ -30,17 +29,17 @@ public class BuildCraftChannelHandler extends FMLIndexedMessageToMessageCodec idMap = HashBiMap.create(); + private static LinkedList playersToInitialize = new LinkedList(); + + public NetworkIdRegistry() { + FMLCommonHandler.instance().bus().register(this); + } + + public static void write(ByteBuf buf, String strId) { + if (!isMaster) { + if (!idMap.containsKey(strId)) { + buf.writeInt(-1); + Utils.writeUTF(buf, strId); + } else { + buf.writeInt(idMap.get(strId)); + } + } else { + if (!idMap.containsKey(strId)) { + idMap.put(strId, idMap.size()); + + if (!isLocal) { + RPCHandler.rpcBroadcastAllPlayers(NetworkIdRegistry.class, "receiveId", strId, idMap.size() - 1); + } + } + + buf.writeInt(idMap.get(strId)); + } + } + + public static String read(ByteBuf buf) { + int id = buf.readInt(); + + if (!isMaster) { + if (!idMap.inverse().containsKey(id)) { + RPCHandler.rpcServer(NetworkIdRegistry.class, "requestId", id); + throw new IllegalArgumentException("Id " + id + " unknown by the registry."); + } else { + return idMap.inverse().get(id); + } + } else { + if (id == -1) { + String str = Utils.readUTF(buf); + + if (!idMap.containsKey(str)) { + idMap.put(str, idMap.size()); + } + + return str; + } else { + return idMap.inverse().get(id); + } + } + } + + @RPC(RPCSide.SERVER) + private static void requestId(int id, RPCMessageInfo info) { + if (!idMap.inverse().containsKey(id)) { + throw new IllegalArgumentException("Id " + id + " unknown by the registry."); + } else { + RPCHandler.rpcPlayer(info.sender, NetworkIdRegistry.class, "receiveId", idMap.inverse().get(id), id); + } + } + + @RPC(RPCSide.SERVER) + private static void receiveId(String str, int id) { + idMap.put(str, id); + } + + private static void sendAllIdsTo(EntityPlayerMP player) { + ArrayList idStr = new ArrayList(); + ArrayList ids = new ArrayList(); + + for (Map.Entry e : idMap.entrySet()) { + idStr.add(e.getKey()); + ids.add(e.getValue()); + } + + RPCHandler.rpcPlayer(player, NetworkIdRegistry.class, "receiveAllIds", idStr, ids); + } + + @RPC(RPCSide.CLIENT) + private static void receiveAllIds(ArrayList idStr, ArrayList ids) { + idMap.clear(); + + for (int i = 0; i < idStr.size(); ++i) { + if (!idMap.containsKey(idStr.get(i))) { + System.out.println("INIT " + ids.get(i) + " => " + idStr.get(i)); + idMap.put(idStr.get(i), ids.get(i)); + } + } + } + + @SubscribeEvent + public void serverConnected(ServerConnectionFromClientEvent evt) { + isMaster = true; + + if (evt.isLocal) { + isLocal = true; + } else { + isLocal = false; + + // the server cannot send messages to the client at this stage, so + // cache the new client to receive ids on the next tick. + playersToInitialize.add(((NetHandlerPlayServer) evt.handler).playerEntity); + } + } + + @SubscribeEvent + public void serverConnected(ClientConnectedToServerEvent evt) { + if (!evt.isLocal) { + isMaster = false; + isLocal = false; + } + } + + @SubscribeEvent + public void tick(ServerTickEvent evt) { + for (EntityPlayerMP player : playersToInitialize) { + sendAllIdsTo(player); + } + + playersToInitialize.clear(); + } + + static { + // The ids below are the minimal ids necessary to initialize properly + // the server. They are aimed at supporting the provide of receiveAllIds + idMap.put("", 0); + idMap.put(NetworkIdRegistry.class.getCanonicalName(), 1); + idMap.put(String.class.getCanonicalName(), 2); + idMap.put(Integer.class.getCanonicalName(), 3); + } +} diff --git a/common/buildcraft/core/network/PacketHandler.java b/common/buildcraft/core/network/PacketHandler.java index ae785e3e..3292bbfc 100644 --- a/common/buildcraft/core/network/PacketHandler.java +++ b/common/buildcraft/core/network/PacketHandler.java @@ -80,20 +80,8 @@ public class PacketHandler extends SimpleChannelInboundHandler break; } - case PacketIds.RPC_TILE: { - ((PacketRPCTile) packet).call(player); - - break; - } - - case PacketIds.RPC_GUI: { - ((PacketRPCGui) packet).call(player); - - break; - } - - case PacketIds.RPC_ENTITY: { - ((PacketRPCEntity) packet).call(player); + case PacketIds.RPC: { + ((PacketRPC) packet).call(player); break; } diff --git a/common/buildcraft/core/network/PacketIds.java b/common/buildcraft/core/network/PacketIds.java index 628b935a..c6604436 100644 --- a/common/buildcraft/core/network/PacketIds.java +++ b/common/buildcraft/core/network/PacketIds.java @@ -17,7 +17,6 @@ public final class PacketIds { public static final int PIPE_POWER = 4; public static final int PIPE_ITEMSTACK_REQUEST = 5; public static final int PIPE_ITEMSTACK = 6; - public static final int PIPE_GATE_EXPANSION_MAP = 7; public static final int DIAMOND_PIPE_SELECT = 31; public static final int EMERALD_PIPE_SELECT = 32; @@ -32,10 +31,8 @@ public final class PacketIds { public static final int STATE_UPDATE = 100; - public static final int RPC_TILE = 110; + public static final int RPC = 110; public static final int RPC_PIPE = 111; - public static final int RPC_GUI = 112; - public static final int RPC_ENTITY = 113; /** * Deactivate constructor diff --git a/common/buildcraft/core/network/PacketRPC.java b/common/buildcraft/core/network/PacketRPC.java new file mode 100755 index 00000000..1060279e --- /dev/null +++ b/common/buildcraft/core/network/PacketRPC.java @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team + * http://www.mod-buildcraft.com + * + * BuildCraft is distributed under the terms of the Minecraft Mod Public + * License 1.0, or MMPL. Please check the contents of the license located in + * http://www.mod-buildcraft.com/MMPL-1.0.txt + */ +package buildcraft.core.network; + +import net.minecraft.entity.player.EntityPlayer; + +public abstract class PacketRPC extends BuildCraftPacket { + + @Override + public final int getID() { + return PacketIds.RPC; + } + + public abstract void call(EntityPlayer sender); +} diff --git a/common/buildcraft/core/network/PacketRPCEntity.java b/common/buildcraft/core/network/PacketRPCEntity.java index 541da12c..998d9218 100755 --- a/common/buildcraft/core/network/PacketRPCEntity.java +++ b/common/buildcraft/core/network/PacketRPCEntity.java @@ -14,7 +14,7 @@ import io.netty.buffer.Unpooled; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; -public class PacketRPCEntity extends BuildCraftPacket { +public class PacketRPCEntity extends PacketRPC { private byte[] contents; private Entity entity; private int entityId; @@ -28,10 +28,6 @@ public class PacketRPCEntity extends BuildCraftPacket { } @Override - public int getID() { - return PacketIds.RPC_ENTITY; - } - public void call(EntityPlayer sender) { RPCMessageInfo info = new RPCMessageInfo(); info.sender = sender; diff --git a/common/buildcraft/core/network/PacketRPCGui.java b/common/buildcraft/core/network/PacketRPCGui.java index d425c844..e8dd0a53 100755 --- a/common/buildcraft/core/network/PacketRPCGui.java +++ b/common/buildcraft/core/network/PacketRPCGui.java @@ -13,7 +13,7 @@ import io.netty.buffer.Unpooled; import net.minecraft.entity.player.EntityPlayer; -public class PacketRPCGui extends BuildCraftPacket { +public class PacketRPCGui extends PacketRPC { byte [] contents; public PacketRPCGui() { @@ -23,17 +23,13 @@ public class PacketRPCGui extends BuildCraftPacket { contents = bytes; } - @Override - public int getID() { - return PacketIds.RPC_GUI; - } - @Override public void readData(ByteBuf data) { contents = new byte [data.readableBytes()]; data.readBytes(contents); } + @Override public void call (EntityPlayer sender) { RPCMessageInfo info = new RPCMessageInfo(); info.sender = sender; diff --git a/common/buildcraft/core/network/PacketRPCStatic.java b/common/buildcraft/core/network/PacketRPCStatic.java new file mode 100755 index 00000000..2076c34a --- /dev/null +++ b/common/buildcraft/core/network/PacketRPCStatic.java @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team + * http://www.mod-buildcraft.com + * + * BuildCraft is distributed under the terms of the Minecraft Mod Public + * License 1.0, or MMPL. Please check the contents of the license located in + * http://www.mod-buildcraft.com/MMPL-1.0.txt + */ +package buildcraft.core.network; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; + +import net.minecraft.entity.player.EntityPlayer; + +public class PacketRPCStatic extends PacketRPC { + private byte[] contents; + private Class clas; + + public PacketRPCStatic() { + } + + public PacketRPCStatic(Class iClass, byte[] bytes) { + contents = bytes; + clas = iClass; + } + + @Override + public void readData(ByteBuf data) { + contents = new byte [data.readableBytes()]; + data.readBytes(contents); + } + + @Override + public void call (EntityPlayer sender) { + RPCMessageInfo info = new RPCMessageInfo(); + info.sender = sender; + + ByteBuf completeData = Unpooled.buffer(); + completeData.writeBytes(contents); + + String classId = NetworkIdRegistry.read(completeData); + + try { + RPCHandler.receiveStaticRPC(Class.forName(classId), info, completeData); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + + @Override + public void writeData(ByteBuf data) { + NetworkIdRegistry.write(data, clas.getCanonicalName()); + data.writeBytes(contents); + } +} diff --git a/common/buildcraft/core/network/PacketRPCTile.java b/common/buildcraft/core/network/PacketRPCTile.java index 9ef275cf..d7fc7807 100755 --- a/common/buildcraft/core/network/PacketRPCTile.java +++ b/common/buildcraft/core/network/PacketRPCTile.java @@ -24,7 +24,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; -public class PacketRPCTile extends BuildCraftPacket { +public class PacketRPCTile extends PacketRPC { public static int GLOBAL_ID = new Random(new Date().getTime()).nextInt(); public static HashMap bufferedPackets = new HashMap(); public TileEntity tile; @@ -40,7 +40,7 @@ public class PacketRPCTile extends BuildCraftPacket { id = GLOBAL_ID++; } - public PacketRPCTile (TileEntity tile, byte [] bytes) { + public PacketRPCTile(TileEntity tile, byte[] bytes) { this.tile = tile; contents = bytes; } @@ -49,11 +49,6 @@ public class PacketRPCTile extends BuildCraftPacket { tile = aTile; } - @Override - public int getID() { - return PacketIds.RPC_TILE; - } - @Override public void readData(ByteBuf data) { dimId = data.readShort(); @@ -67,6 +62,7 @@ public class PacketRPCTile extends BuildCraftPacket { data.readBytes(contents); } + @Override public void call (EntityPlayer sender) { World world = null; diff --git a/common/buildcraft/core/network/RPCHandler.java b/common/buildcraft/core/network/RPCHandler.java index 1a8e2251..04aaea03 100755 --- a/common/buildcraft/core/network/RPCHandler.java +++ b/common/buildcraft/core/network/RPCHandler.java @@ -28,6 +28,8 @@ import net.minecraft.inventory.Container; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import cpw.mods.fml.common.FMLCommonHandler; + import buildcraft.BuildCraftCore; import buildcraft.api.core.JavaTools; import buildcraft.core.DefaultProps; @@ -108,11 +110,24 @@ public final class RPCHandler { methods = mappings.toArray(new MethodMapping [mappings.size()]); } - public static void rpcServer(Object object, String method, Object... actuals) { - if (!handlers.containsKey(object.getClass().getName())) { - handlers.put(object.getClass().getName(), new RPCHandler(object.getClass())); + private static RPCHandler getHandler(Object object) { + Class clas; + + if (object instanceof Class) { + clas = (Class) object; + } else { + clas = object.getClass(); } + if (!handlers.containsKey(clas.getName())) { + handlers.put(clas.getName(), new RPCHandler(clas)); + } + + return handlers.get(clas.getName()); + + } + + public static void rpcServer(Object object, String method, Object... actuals) { BuildCraftPacket packet = createPacket(object, method, actuals); if (packet != null) { @@ -127,10 +142,6 @@ public final class RPCHandler { } public static void rpcPlayer(EntityPlayer player, Object object, String method, Object... actuals) { - if (!handlers.containsKey(object.getClass().getName())) { - handlers.put(object.getClass().getName(), new RPCHandler(object.getClass())); - } - BuildCraftPacket packet = createPacket(object, method, actuals); if (packet != null) { @@ -144,16 +155,12 @@ public final class RPCHandler { } } - public static void rpcBroadcastPlayers(World world, Object object, String method, Object... actuals) { + public static void rpcBroadcastWorldPlayers(World world, Object object, String method, Object... actuals) { RPCHandler.rpcBroadcastPlayersAtDistance(world, object, method, DefaultProps.NETWORK_UPDATE_RANGE, actuals); } public static void rpcBroadcastPlayersAtDistance(World world, Object object, String method, int maxDistance, Object... actuals) { - if (!handlers.containsKey(object.getClass().getName())) { - handlers.put(object.getClass().getName(), new RPCHandler(object.getClass())); - } - BuildCraftPacket packet = createPacket(object, method, actuals); if (packet != null) { @@ -183,15 +190,27 @@ public final class RPCHandler { } } + public static void rpcBroadcastAllPlayers(Object object, String method, Object... actuals) { + BuildCraftPacket packet = createPacket(object, method, actuals); + + if (packet != null) { + for (Object o : FMLCommonHandler.instance().getMinecraftServerInstance().getConfigurationManager().playerEntityList) { + EntityPlayerMP player = (EntityPlayerMP) o; + + BuildCraftCore.instance.sendToPlayer(player, packet); + } + } + } + + public static void receiveStaticRPC(Class clas, RPCMessageInfo info, ByteBuf data) { + if (clas != null) { + getHandler(clas).internalRpcReceive(clas, info, data); + } + } + public static void receiveRPC(Object obj, RPCMessageInfo info, ByteBuf data) { if (obj != null) { - if (!handlers.containsKey(obj.getClass().getName())) { - handlers.put(obj.getClass().getName(), - new RPCHandler(obj.getClass())); - } - - handlers.get(obj.getClass().getName()).internalRpcReceive(obj, - info, data); + getHandler(obj.getClass()).internalRpcReceive(obj, info, data); } } @@ -227,12 +246,13 @@ public final class RPCHandler { BuildCraftPacket packet = null; if (object instanceof Container) { - packet = handlers.get(object.getClass().getName()).createRCPPacketContainer(method, actuals); + packet = getHandler(object).createRCPPacketContainer(method, actuals); } else if (object instanceof TileEntity) { - packet = handlers.get(object.getClass().getName()) - .createRCPPacketTile((TileEntity) object, method, actuals); + packet = getHandler(object).createRCPPacketTile((TileEntity) object, method, actuals); } else if (object instanceof Entity) { - packet = handlers.get(object.getClass().getName()).createRCPPacketEntity((Entity) object, method, actuals); + packet = getHandler(object).createRCPPacketEntity((Entity) object, method, actuals); + } else if (object instanceof Class) { + packet = getHandler(object).createRCPPacketStatic((Class) object, method, actuals); } return packet; @@ -269,6 +289,10 @@ public final class RPCHandler { return new PacketRPCEntity(entity, getBytes(method, actuals)); } + private BuildCraftPacket createRCPPacketStatic(Class clas, String method, Object[] actuals) { + return new PacketRPCStatic(clas, getBytes(method, actuals)); + } + private void writeParameters(String method, ByteBuf data, Object... actuals) throws IOException, IllegalArgumentException, IllegalAccessException { @@ -321,8 +345,8 @@ public final class RPCHandler { Object[] array = (Object[]) actual; Class componentType = formal.getComponentType(); data.writeInt(array.length); - for (int i = 0; i < array.length; i++) { - writePrimitive(data, componentType, array[i]); + for (Object element : array) { + writePrimitive(data, componentType, element); } } else { return false; diff --git a/common/buildcraft/core/network/serializers/ClassMapping.java b/common/buildcraft/core/network/serializers/ClassMapping.java index 6c72ec15..9622ef22 100644 --- a/common/buildcraft/core/network/serializers/ClassMapping.java +++ b/common/buildcraft/core/network/serializers/ClassMapping.java @@ -31,7 +31,7 @@ import net.minecraftforge.fluids.FluidStack; import buildcraft.api.core.JavaTools; import buildcraft.api.core.NetworkData; import buildcraft.core.network.INBTSerializable; -import buildcraft.core.utils.Utils; +import buildcraft.core.network.NetworkIdRegistry; /** * This class implements custom class mapping. There are three advantages in @@ -255,24 +255,8 @@ public class ClassMapping extends ClassSerializer { if (realClass.equals(this.mappedClass)) { data.writeByte(0); } else { - ClassMapping delegateMapping; - - if (context.classToId.containsKey(realClass.getCanonicalName())) { - int index = context.classToId.get(realClass.getCanonicalName()) + 1; - data.writeByte(index); - delegateMapping = (ClassMapping) context.idToClass.get(index - 1); - } else { - int index = context.classToId.size() + 1; - delegateMapping = (ClassMapping) get(realClass); - - data.writeByte(index); - Utils.writeUTF(data, realClass.getCanonicalName()); - context.classToId.put(realClass.getCanonicalName(), - context.classToId.size()); - context.idToClass.add(delegateMapping); - } - - delegateMapping.writeClass(obj, data, context); + NetworkIdRegistry.write(data, realClass.getCanonicalName()); + ClassMapping delegateMapping = (ClassMapping) get(realClass); return; } @@ -323,27 +307,15 @@ public class ClassMapping extends ClassSerializer { // {false} exit // [int] what is the object real class? // {0} the same as the declared class - // {1-x} a different one - // [string] if the number is not yet registered, the name of the - // class + // {1-x} the network id of the class // [bytes] the actual contents int index = data.readByte(); if (index != 0) { - ClassMapping delegateMapping; - - if (context.idToClass.size() < index) { - String className = Utils.readUTF(data); - - Class cls = Class.forName(className); - - delegateMapping = (ClassMapping) get(cls); - - context.idToClass.add(get(cls)); - } else { - delegateMapping = (ClassMapping) context.idToClass.get(index - 1); - } + String className = NetworkIdRegistry.read(data); + Class cls = Class.forName(className); + ClassMapping delegateMapping = (ClassMapping) get(cls); return delegateMapping.readClass(obj, data, context); } @@ -452,7 +424,7 @@ public class ClassMapping extends ClassSerializer { for (Enum element : arr) { data.writeBoolean(element != null); - + if (element != null) { data.writeByte(element.ordinal()); } diff --git a/common/buildcraft/core/network/serializers/NetworkId.java b/common/buildcraft/core/network/serializers/NetworkId.java new file mode 100755 index 00000000..702baa0e --- /dev/null +++ b/common/buildcraft/core/network/serializers/NetworkId.java @@ -0,0 +1,13 @@ +package buildcraft.core.network.serializers; + +public class NetworkId { + + private String str; + private String id; + + public NetworkId(String str) { + id = str; + } + + +} diff --git a/common/buildcraft/core/network/serializers/SerializationContext.java b/common/buildcraft/core/network/serializers/SerializationContext.java index b1dd3750..e7fee397 100755 --- a/common/buildcraft/core/network/serializers/SerializationContext.java +++ b/common/buildcraft/core/network/serializers/SerializationContext.java @@ -8,11 +8,6 @@ */ package buildcraft.core.network.serializers; -import java.util.ArrayList; -import java.util.Map; -import java.util.TreeMap; - public class SerializationContext { - public ArrayList idToClass = new ArrayList (); - public Map classToId = new TreeMap(); + } \ No newline at end of file diff --git a/common/buildcraft/core/network/serializers/SerializerObject.java b/common/buildcraft/core/network/serializers/SerializerObject.java index 07ce531f..7fe9bbe0 100755 --- a/common/buildcraft/core/network/serializers/SerializerObject.java +++ b/common/buildcraft/core/network/serializers/SerializerObject.java @@ -10,7 +10,7 @@ package buildcraft.core.network.serializers; import io.netty.buffer.ByteBuf; -import buildcraft.core.utils.Utils; +import buildcraft.core.network.NetworkIdRegistry; public class SerializerObject extends ClassSerializer { @@ -23,21 +23,8 @@ public class SerializerObject extends ClassSerializer { data.writeBoolean(true); Class realClass = o.getClass(); - ClassSerializer delegateMapping; - - if (context.classToId.containsKey(realClass.getCanonicalName())) { - int index = context.classToId.get(realClass.getCanonicalName()) + 1; - data.writeByte(index); - delegateMapping = context.idToClass.get(index - 1); - } else { - int index = context.classToId.size() + 1; - delegateMapping = ClassMapping.get(realClass); - data.writeByte(index); - Utils.writeUTF(data, realClass.getCanonicalName()); - context.classToId.put(realClass.getCanonicalName(), - context.classToId.size()); - context.idToClass.add(delegateMapping); - } + NetworkIdRegistry.write(data, realClass.getCanonicalName()); + ClassSerializer delegateMapping = ClassMapping.get(realClass); if (delegateMapping instanceof ClassMapping) { ((ClassMapping) delegateMapping).writeClass(o, data, context); @@ -54,20 +41,9 @@ public class SerializerObject extends ClassSerializer { if (!data.readBoolean()) { return null; } else { - int index = data.readByte(); - - ClassSerializer delegateMapping; - - if (context.idToClass.size() < index) { - String className = Utils.readUTF(data); - - Class cls = Class.forName(className); - delegateMapping = ClassMapping.get(cls); - - context.idToClass.add(ClassMapping.get(cls)); - } else { - delegateMapping = context.idToClass.get(index - 1); - } + String className = NetworkIdRegistry.read(data); + Class cls = Class.forName(className); + ClassSerializer delegateMapping = ClassMapping.get(cls); if (delegateMapping instanceof ClassMapping) { return ((ClassMapping) delegateMapping).readClass(o, data, context); diff --git a/common/buildcraft/core/robots/EntityRobot.java b/common/buildcraft/core/robots/EntityRobot.java index d041234d..cdf10dcd 100755 --- a/common/buildcraft/core/robots/EntityRobot.java +++ b/common/buildcraft/core/robots/EntityRobot.java @@ -517,7 +517,7 @@ public class EntityRobot extends EntityRobotBase implements @Override public void setItemInUse(ItemStack stack) { itemInUse = stack; - RPCHandler.rpcBroadcastPlayers(worldObj, this, "clientSetItemInUse", stack); + RPCHandler.rpcBroadcastWorldPlayers(worldObj, this, "clientSetItemInUse", stack); } @RPC(RPCSide.CLIENT) @@ -567,7 +567,7 @@ public class EntityRobot extends EntityRobotBase implements @Override public void setItemActive(boolean isActive) { - RPCHandler.rpcBroadcastPlayers(worldObj, this, "rpcSetItemActive", isActive); + RPCHandler.rpcBroadcastWorldPlayers(worldObj, this, "rpcSetItemActive", isActive); } @RPC(RPCSide.CLIENT) diff --git a/common/buildcraft/energy/TileEnergyEmitter.java b/common/buildcraft/energy/TileEnergyEmitter.java index ae16d2ce..df793a2b 100755 --- a/common/buildcraft/energy/TileEnergyEmitter.java +++ b/common/buildcraft/energy/TileEnergyEmitter.java @@ -94,7 +94,7 @@ public class TileEnergyEmitter extends TileBuildCraft { addLaser(receiver.xCoord, receiver.yCoord, receiver.zCoord); - RPCHandler.rpcBroadcastPlayers(worldObj, this, "addLaser", + RPCHandler.rpcBroadcastWorldPlayers(worldObj, this, "addLaser", receiver.xCoord, receiver.yCoord, receiver.zCoord); @@ -111,7 +111,7 @@ public class TileEnergyEmitter extends TileBuildCraft { accumulated++; if (syncMJ.markTimeIfDelay(worldObj)) { - RPCHandler.rpcBroadcastPlayers(worldObj, this, "synchronizeMJ", mjAcc + RPCHandler.rpcBroadcastWorldPlayers(worldObj, this, "synchronizeMJ", mjAcc / accumulated); mjAcc = 0; accumulated = 0; @@ -121,7 +121,7 @@ public class TileEnergyEmitter extends TileBuildCraft { for (Target t : targets.values()) { if (t.data.isVisible) { t.data.isVisible = false; - RPCHandler.rpcBroadcastPlayers(worldObj, this, "disableLaser", + RPCHandler.rpcBroadcastWorldPlayers(worldObj, this, "disableLaser", t.receiver.xCoord, t.receiver.yCoord, t.receiver.zCoord); } @@ -139,7 +139,7 @@ public class TileEnergyEmitter extends TileBuildCraft { for (Target t : targets.values()) { if (!t.data.isVisible) { t.data.isVisible = true; - RPCHandler.rpcBroadcastPlayers(worldObj, this, "enableLaser", + RPCHandler.rpcBroadcastWorldPlayers(worldObj, this, "enableLaser", t.receiver.xCoord, t.receiver.yCoord, t.receiver.zCoord); } diff --git a/common/buildcraft/transport/gates/ItemGate.java b/common/buildcraft/transport/gates/ItemGate.java index d60111a6..5c5a0a07 100644 --- a/common/buildcraft/transport/gates/ItemGate.java +++ b/common/buildcraft/transport/gates/ItemGate.java @@ -14,6 +14,7 @@ import java.util.List; import java.util.Set; import io.netty.buffer.ByteBuf; + import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; @@ -40,6 +41,7 @@ import buildcraft.api.transport.IPipePluggable; import buildcraft.api.transport.IPipeTile; import buildcraft.core.ItemBuildCraft; import buildcraft.core.inventory.InvUtils; +import buildcraft.core.network.NetworkIdRegistry; import buildcraft.core.utils.StringUtils; import buildcraft.transport.Gate; import buildcraft.transport.TileGenericPipe; @@ -95,7 +97,7 @@ public class ItemGate extends ItemBuildCraft { final int expansionsSize = expansions.length; buf.writeInt(expansionsSize); for (IGateExpansion expansion : expansions) { - buf.writeByte(GateExpansions.getServerExpansionID(expansion.getUniqueIdentifier())); + NetworkIdRegistry.write(buf, expansion.getUniqueIdentifier()); } } @@ -106,7 +108,7 @@ public class ItemGate extends ItemBuildCraft { final int expansionsSize = buf.readInt(); expansions = new IGateExpansion[expansionsSize]; for (int i = 0; i < expansionsSize; i++) { - expansions[i] = GateExpansions.getExpansionClient(buf.readByte()); + expansions[i] = GateExpansions.getExpansion(NetworkIdRegistry.read(buf)); } } diff --git a/common/buildcraft/transport/network/PacketGateExpansionMap.java b/common/buildcraft/transport/network/PacketGateExpansionMap.java deleted file mode 100644 index d62a59d1..00000000 --- a/common/buildcraft/transport/network/PacketGateExpansionMap.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team - * http://www.mod-buildcraft.com - * - * BuildCraft is distributed under the terms of the Minecraft Mod Public - * License 1.0, or MMPL. Please check the contents of the license located in - * http://www.mod-buildcraft.com/MMPL-1.0.txt - */ -package buildcraft.transport.network; - -import java.util.Map; - -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; - -import io.netty.buffer.ByteBuf; - -import buildcraft.api.gates.GateExpansions; -import buildcraft.core.network.BuildCraftPacket; -import buildcraft.core.network.PacketIds; -import buildcraft.core.utils.Utils; - -public class PacketGateExpansionMap extends BuildCraftPacket { - - public PacketGateExpansionMap() { - } - - @Override - public void writeData(ByteBuf data) { - BiMap map = GateExpansions.getServerMap(); - data.writeByte(map.size()); - for (Map.Entry entry : map.entrySet()) { - data.writeByte(entry.getKey()); - Utils.writeUTF(data, entry.getValue()); - } - } - - @Override - public void readData(ByteBuf data) { - int numEntries = data.readByte(); - BiMap map = HashBiMap.create(numEntries); - for (int i = 0; i < numEntries; i++) { - byte id = data.readByte(); - String identifier = Utils.readUTF(data); - map.put(id, identifier); - } - GateExpansions.setClientMap(map); - } - - @Override - public int getID() { - return PacketIds.PIPE_GATE_EXPANSION_MAP; - } -} diff --git a/common/buildcraft/transport/network/PacketHandlerTransport.java b/common/buildcraft/transport/network/PacketHandlerTransport.java index 9be2d437..a855befe 100644 --- a/common/buildcraft/transport/network/PacketHandlerTransport.java +++ b/common/buildcraft/transport/network/PacketHandlerTransport.java @@ -61,10 +61,6 @@ public class PacketHandlerTransport extends SimpleChannelInboundHandler