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