diff --git a/fml/client/cpw/mods/fml/client/FMLClientHandler.java b/fml/client/cpw/mods/fml/client/FMLClientHandler.java index dbd66c0c5..4e36af6d7 100644 --- a/fml/client/cpw/mods/fml/client/FMLClientHandler.java +++ b/fml/client/cpw/mods/fml/client/FMLClientHandler.java @@ -27,7 +27,10 @@ import net.minecraft.src.Entity; import net.minecraft.src.EntityLiving; import net.minecraft.src.EntityPlayer; import net.minecraft.src.GuiScreen; +import net.minecraft.src.NetClientHandler; +import net.minecraft.src.NetHandler; import net.minecraft.src.Packet; +import net.minecraft.src.Packet131MapData; import net.minecraft.src.Render; import net.minecraft.src.RenderManager; import net.minecraft.src.World; @@ -400,4 +403,10 @@ public class FMLClientHandler implements IFMLSidedHandler { return loading; } + + @Override + public void handleTinyPacket(NetHandler handler, Packet131MapData mapData) + { + ((NetClientHandler)handler).fmlPacket131Callback(mapData); + } } diff --git a/fml/common/cpw/mods/fml/common/FMLCommonHandler.java b/fml/common/cpw/mods/fml/common/FMLCommonHandler.java index e1e33eb53..0908ead7c 100644 --- a/fml/common/cpw/mods/fml/common/FMLCommonHandler.java +++ b/fml/common/cpw/mods/fml/common/FMLCommonHandler.java @@ -25,6 +25,8 @@ import net.minecraft.src.DedicatedServer; import net.minecraft.src.Entity; import net.minecraft.src.EntityPlayer; import net.minecraft.src.EntityPlayerMP; +import net.minecraft.src.NetHandler; +import net.minecraft.src.Packet131MapData; import net.minecraft.src.ServerListenThread; import net.minecraft.src.ThreadServerApplication; import net.minecraft.src.World; @@ -401,4 +403,9 @@ public class FMLCommonHandler crashReport.func_71500_a(call.getLabel(), call); } } + + public void handleTinyPacket(NetHandler handler, Packet131MapData mapData) + { + sidedDelegate.handleTinyPacket(handler, mapData); + } } diff --git a/fml/common/cpw/mods/fml/common/IFMLSidedHandler.java b/fml/common/cpw/mods/fml/common/IFMLSidedHandler.java index a849a1866..b46a9a8ca 100644 --- a/fml/common/cpw/mods/fml/common/IFMLSidedHandler.java +++ b/fml/common/cpw/mods/fml/common/IFMLSidedHandler.java @@ -4,7 +4,9 @@ import java.util.List; import net.minecraft.server.MinecraftServer; import net.minecraft.src.Entity; +import net.minecraft.src.NetHandler; import net.minecraft.src.Packet; +import net.minecraft.src.Packet131MapData; import cpw.mods.fml.common.network.EntitySpawnAdjustmentPacket; import cpw.mods.fml.common.network.EntitySpawnPacket; import cpw.mods.fml.common.network.ModMissingPacket; @@ -33,4 +35,6 @@ public interface IFMLSidedHandler void sendPacket(Packet packet); void displayMissingMods(ModMissingPacket modMissingPacket); + + void handleTinyPacket(NetHandler handler, Packet131MapData mapData); } diff --git a/fml/common/cpw/mods/fml/common/network/FMLNetworkHandler.java b/fml/common/cpw/mods/fml/common/network/FMLNetworkHandler.java index 04dac2fdc..03469ec97 100644 --- a/fml/common/cpw/mods/fml/common/network/FMLNetworkHandler.java +++ b/fml/common/cpw/mods/fml/common/network/FMLNetworkHandler.java @@ -16,11 +16,13 @@ import net.minecraft.src.Entity; import net.minecraft.src.EntityPlayer; import net.minecraft.src.EntityPlayerMP; import net.minecraft.src.EnumGameType; +import net.minecraft.src.Item; import net.minecraft.src.NetHandler; import net.minecraft.src.NetLoginHandler; import net.minecraft.src.NetServerHandler; import net.minecraft.src.NetworkManager; import net.minecraft.src.Packet; +import net.minecraft.src.Packet131MapData; import net.minecraft.src.Packet1Login; import net.minecraft.src.Packet250CustomPayload; import net.minecraft.src.Packet3Chat; @@ -396,4 +398,16 @@ public class FMLNetworkHandler { return NetworkRegistry.instance().handleChat(handler, chat); } + + public static void handlePacket131Packet(NetHandler handler, Packet131MapData mapData) + { + if (handler instanceof NetServerHandler || mapData.field_73438_a != Item.field_77744_bd.field_77779_bT) + { + NetworkRegistry.instance().handleTinyPacket(handler, mapData); + } + else + { + FMLCommonHandler.instance().handleTinyPacket(handler, mapData); + } + } } \ No newline at end of file diff --git a/fml/common/cpw/mods/fml/common/network/ITinyPacketHandler.java b/fml/common/cpw/mods/fml/common/network/ITinyPacketHandler.java new file mode 100644 index 000000000..191f665eb --- /dev/null +++ b/fml/common/cpw/mods/fml/common/network/ITinyPacketHandler.java @@ -0,0 +1,9 @@ +package cpw.mods.fml.common.network; + +import net.minecraft.src.NetHandler; +import net.minecraft.src.Packet131MapData; + +public interface ITinyPacketHandler +{ + void handle(NetHandler handler, Packet131MapData mapData); +} diff --git a/fml/common/cpw/mods/fml/common/network/NetworkMod.java b/fml/common/cpw/mods/fml/common/network/NetworkMod.java index 5d3106a63..817e175e3 100644 --- a/fml/common/cpw/mods/fml/common/network/NetworkMod.java +++ b/fml/common/cpw/mods/fml/common/network/NetworkMod.java @@ -5,6 +5,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import net.minecraft.src.Packet131MapData; + @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface NetworkMod @@ -42,6 +44,13 @@ public @interface NetworkMod */ Class packetHandler() default NULL.class; + /** + * A tiny packet handler implementation based on {@link Packet131MapData} for "small" + * data packet loads. + * + * @return + */ + Class tinyPacketHandler() default NULL.class; /** * A connection handler implementation for this network mod * @@ -66,7 +75,7 @@ public @interface NetworkMod * @author cpw * */ - static interface NULL extends IPacketHandler, IConnectionHandler {}; + static interface NULL extends IPacketHandler, IConnectionHandler, ITinyPacketHandler {}; /** * A marker for a method that will be offered the client's version string @@ -89,4 +98,5 @@ public @interface NetworkMod String[] channels(); Class packetHandler(); } + } diff --git a/fml/common/cpw/mods/fml/common/network/NetworkModHandler.java b/fml/common/cpw/mods/fml/common/network/NetworkModHandler.java index e5f5b23a1..1b94fb419 100644 --- a/fml/common/cpw/mods/fml/common/network/NetworkModHandler.java +++ b/fml/common/cpw/mods/fml/common/network/NetworkModHandler.java @@ -4,6 +4,8 @@ import java.lang.reflect.Method; import java.util.Set; import java.util.logging.Level; +import net.minecraft.src.Item; + import com.google.common.base.Strings; import cpw.mods.fml.common.FMLCommonHandler; @@ -22,6 +24,7 @@ public class NetworkModHandler private static Object packetHandlerDefaultValue; private static Object clientHandlerDefaultValue; private static Object serverHandlerDefaultValue; + private static Object tinyPacketHandlerDefaultValue; private static int assignedIds = 1; @@ -33,6 +36,7 @@ public class NetworkModHandler private Method checkHandler; private VersionRange acceptableRange; + private ITinyPacketHandler tinyPacketHandler; public NetworkModHandler(ModContainer container, NetworkMod modAnnotation) { @@ -40,6 +44,11 @@ public class NetworkModHandler this.mod = modAnnotation; this.localId = assignedIds++; this.networkId = this.localId; + // Skip over the map object because it has special network id meaning + if (Item.field_77744_bd.field_77779_bT == assignedIds) + { + assignedIds++; + } } public NetworkModHandler(ModContainer container, Class networkModClass, ASMDataTable table) { @@ -130,6 +139,19 @@ public class NetworkModHandler NetworkRegistry.instance().registerConnectionHandler(instance); } + + if (mod.tinyPacketHandler()!=tinyPacketHandlerDefaultValue) + { + try + { + tinyPacketHandler = mod.tinyPacketHandler().newInstance(); + } + catch (Exception e) + { + FMLLog.log(Level.SEVERE, e, "Unable to create tiny packet handler instance %s", mod.tinyPacketHandler().getName()); + throw new FMLNetworkException(e); + } + } } /** * @param container @@ -206,6 +228,20 @@ public class NetworkModHandler } } + private Object getTinyPacketHandlerDefaultValue() + { + try { + if (tinyPacketHandlerDefaultValue == null) + { + tinyPacketHandlerDefaultValue = NetworkMod.class.getMethod("tinyPacketHandler").getDefaultValue(); + } + return tinyPacketHandlerDefaultValue; + } + catch (NoSuchMethodException e) + { + throw new RuntimeException("Derp?", e); + } + } /** * @return */ @@ -302,4 +338,13 @@ public class NetworkModHandler { this.networkId = value; } + + public boolean hasTinyPacketHandler() + { + return tinyPacketHandler != null; + } + public ITinyPacketHandler getTinyPacketHandler() + { + return tinyPacketHandler; + } } diff --git a/fml/common/cpw/mods/fml/common/network/NetworkRegistry.java b/fml/common/cpw/mods/fml/common/network/NetworkRegistry.java index bb03717c5..f46dc1240 100644 --- a/fml/common/cpw/mods/fml/common/network/NetworkRegistry.java +++ b/fml/common/cpw/mods/fml/common/network/NetworkRegistry.java @@ -14,6 +14,7 @@ import net.minecraft.src.NetHandler; import net.minecraft.src.NetLoginHandler; import net.minecraft.src.NetServerHandler; import net.minecraft.src.NetworkManager; +import net.minecraft.src.Packet131MapData; import net.minecraft.src.Packet1Login; import net.minecraft.src.Packet250CustomPayload; import net.minecraft.src.Packet3Chat; @@ -337,4 +338,21 @@ public class NetworkRegistry return chat; } + public void handleTinyPacket(NetHandler handler, Packet131MapData mapData) + { + NetworkModHandler nmh = FMLNetworkHandler.instance().findNetworkModHandler(mapData.field_73438_a); + if (nmh == null) + { + FMLLog.info("Received a tiny packet for network id %d that is not recognised here", mapData.field_73438_a); + return; + } + if (nmh.hasTinyPacketHandler()) + { + nmh.getTinyPacketHandler().handle(handler, mapData); + } + else + { + FMLLog.info("Received a tiny packet for a network mod that does not accept tiny packets %s", nmh.getContainer().getModId()); + } + } } diff --git a/fml/common/cpw/mods/fml/common/network/PacketDispatcher.java b/fml/common/cpw/mods/fml/common/network/PacketDispatcher.java index b1b722279..cc08d125c 100644 --- a/fml/common/cpw/mods/fml/common/network/PacketDispatcher.java +++ b/fml/common/cpw/mods/fml/common/network/PacketDispatcher.java @@ -45,4 +45,30 @@ public class PacketDispatcher FMLLog.fine("Attempt to send packet to all around without a server instance available"); } } + + public static void sendPacketToAllInDimension(Packet packet, int dimId) + { + MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance(); + if (server != null) + { + server.func_71203_ab().func_72396_a(packet, dimId); + } + else + { + FMLLog.fine("Attempt to send packet to all in dimension without a server instance available"); + } + } + + public static void sendPacketToAllPlayers(Packet packet) + { + MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance(); + if (server != null) + { + server.func_71203_ab().func_72384_a(packet); + } + else + { + FMLLog.fine("Attempt to send packet to all in dimension without a server instance available"); + } + } } diff --git a/fml/common/cpw/mods/fml/server/FMLServerHandler.java b/fml/common/cpw/mods/fml/server/FMLServerHandler.java index c5b0a3a2d..60cde4877 100644 --- a/fml/common/cpw/mods/fml/server/FMLServerHandler.java +++ b/fml/common/cpw/mods/fml/server/FMLServerHandler.java @@ -16,7 +16,9 @@ import java.util.List; import net.minecraft.server.MinecraftServer; import net.minecraft.src.Entity; +import net.minecraft.src.NetHandler; import net.minecraft.src.Packet; +import net.minecraft.src.Packet131MapData; import net.minecraft.src.World; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.IFMLSidedHandler; @@ -156,4 +158,9 @@ public class FMLServerHandler implements IFMLSidedHandler { // NOOP on server } + @Override + public void handleTinyPacket(NetHandler handler, Packet131MapData mapData) + { + // NOOP on server + } } diff --git a/fml/patches/common/net/minecraft/src/NetServerHandler.java.patch b/fml/patches/common/net/minecraft/src/NetServerHandler.java.patch index c5b31ea2d..80aa6003b 100644 --- a/fml/patches/common/net/minecraft/src/NetServerHandler.java.patch +++ b/fml/patches/common/net/minecraft/src/NetServerHandler.java.patch @@ -29,11 +29,17 @@ DataInputStream var2; ItemStack var3; ItemStack var4; -@@ -1029,4 +1037,11 @@ +@@ -1029,4 +1037,17 @@ } } } + ++ @Override ++ public void func_72494_a(Packet131MapData p_72494_1_) ++ { ++ FMLNetworkHandler.handlePacket131Packet(this, p_72494_1_); ++ } ++ + // modloader compat -- yuk! + @Override + public EntityPlayerMP getPlayer() diff --git a/fml/patches/common/net/minecraft/src/Packet.java.patch b/fml/patches/common/net/minecraft/src/Packet.java.patch new file mode 100644 index 000000000..79f15b176 --- /dev/null +++ b/fml/patches/common/net/minecraft/src/Packet.java.patch @@ -0,0 +1,11 @@ +--- ../src-base/common/net/minecraft/src/Packet.java ++++ ../src-work/common/net/minecraft/src/Packet.java +@@ -341,7 +341,7 @@ + func_73285_a(107, true, true, Packet107CreativeSetSlot.class); + func_73285_a(108, false, true, Packet108EnchantItem.class); + func_73285_a(130, true, true, Packet130UpdateSign.class); +- func_73285_a(131, true, false, Packet131MapData.class); ++ func_73285_a(131, true, true, Packet131MapData.class); + func_73285_a(132, true, false, Packet132TileEntityData.class); + func_73285_a(200, true, false, Packet200Statistic.class); + func_73285_a(201, true, false, Packet201PlayerInfo.class); diff --git a/fml/patches/minecraft/net/minecraft/src/NetClientHandler.java.patch b/fml/patches/minecraft/net/minecraft/src/NetClientHandler.java.patch index 94707f9b8..4b131b20a 100644 --- a/fml/patches/minecraft/net/minecraft/src/NetClientHandler.java.patch +++ b/fml/patches/minecraft/net/minecraft/src/NetClientHandler.java.patch @@ -49,19 +49,31 @@ this.field_72563_h.field_71456_v.func_73827_b().func_73765_a(p_72481_1_.field_73476_b); } -@@ -1167,6 +1174,11 @@ +@@ -1066,6 +1073,11 @@ + + public void func_72494_a(Packet131MapData p_72494_1_) + { ++ FMLNetworkHandler.handlePacket131Packet(this, p_72494_1_); ++ } ++ ++ public void fmlPacket131Callback(Packet131MapData p_72494_1_) ++ { + if (p_72494_1_.field_73438_a == Item.field_77744_bd.field_77779_bT) + { + ItemMap.func_77874_a(p_72494_1_.field_73436_b, this.field_72563_h.field_71441_e).func_76192_a(p_72494_1_.field_73437_c); +@@ -1166,6 +1178,11 @@ + } public void func_72501_a(Packet250CustomPayload p_72501_1_) - { ++ { + FMLNetworkHandler.handlePacket250Packet(p_72501_1_, field_72555_g, this); + } + + public void handleVanilla250Packet(Packet250CustomPayload p_72501_1_) -+ { + { if ("MC|TPack".equals(p_72501_1_.field_73630_a)) { - String[] var2 = (new String(p_72501_1_.field_73629_c)).split("\u0000"); -@@ -1211,4 +1223,10 @@ +@@ -1211,4 +1228,10 @@ { return this.field_72555_g; }