From ecd4e46a45e5013d2c65efdc27ca2ac7d420a76f Mon Sep 17 00:00:00 2001 From: Christian Date: Fri, 7 Sep 2012 22:46:31 -0400 Subject: [PATCH] Attempt to build some protocol negotiation, and fix packet1login so that the dimension is a short, matching packet9respawn --- .../cpw/mods/fml/client/FMLClientHandler.java | 12 +++- .../cpw/mods/fml/common/IFMLSidedHandler.java | 4 +- .../fml/common/network/FMLNetworkHandler.java | 7 ++ .../common/network/ModListRequestPacket.java | 15 ++-- .../cpw/mods/fml/server/FMLServerHandler.java | 10 ++- .../net/minecraft/src/Packet1Login.java.patch | 72 +++++++++++++++++++ .../minecraft/src/NetClientHandler.java.patch | 8 +-- 7 files changed, 109 insertions(+), 19 deletions(-) create mode 100644 patches/common/net/minecraft/src/Packet1Login.java.patch diff --git a/client/cpw/mods/fml/client/FMLClientHandler.java b/client/cpw/mods/fml/client/FMLClientHandler.java index c257768789..2e1040ee67 100644 --- a/client/cpw/mods/fml/client/FMLClientHandler.java +++ b/client/cpw/mods/fml/client/FMLClientHandler.java @@ -411,8 +411,16 @@ public class FMLClientHandler implements IFMLSidedHandler } @Override - public void setCompatibilityLevel(NetHandler netHandler, byte compatibilityLevel) + public void setClientCompatibilityLevel(byte compatibilityLevel) { - ((NetClientHandler)netHandler).setConnectionCompatibilityLevel(compatibilityLevel); + NetClientHandler.setConnectionCompatibilityLevel(compatibilityLevel); + } + + @Override + public byte getClientCompatibilityLevel() + { + System.out.printf("Client Compatibility %d\n", NetClientHandler.getConnectionCompatibilityLevel()); + Thread.dumpStack(); + return NetClientHandler.getConnectionCompatibilityLevel(); } } diff --git a/common/cpw/mods/fml/common/IFMLSidedHandler.java b/common/cpw/mods/fml/common/IFMLSidedHandler.java index 97a9933562..d3db4165bd 100644 --- a/common/cpw/mods/fml/common/IFMLSidedHandler.java +++ b/common/cpw/mods/fml/common/IFMLSidedHandler.java @@ -38,5 +38,7 @@ public interface IFMLSidedHandler void handleTinyPacket(NetHandler handler, Packet131MapData mapData); - void setCompatibilityLevel(NetHandler netHandler, byte compatibilityLevel); + void setClientCompatibilityLevel(byte compatibilityLevel); + + byte getClientCompatibilityLevel(); } diff --git a/common/cpw/mods/fml/common/network/FMLNetworkHandler.java b/common/cpw/mods/fml/common/network/FMLNetworkHandler.java index 20f539158c..113d762aa4 100644 --- a/common/cpw/mods/fml/common/network/FMLNetworkHandler.java +++ b/common/cpw/mods/fml/common/network/FMLNetworkHandler.java @@ -218,6 +218,8 @@ public class FMLNetworkHandler public static Packet1Login getFMLFakeLoginPacket() { + // Always reset compat to zero before sending our fake packet + FMLCommonHandler.instance().getSidedDelegate().setClientCompatibilityLevel((byte) 0); Packet1Login fake = new Packet1Login(); // Hash FML using a simple function fake.field_73561_a = FML_HASH; @@ -412,4 +414,9 @@ public class FMLNetworkHandler { return PROTOCOL_VERSION; } + + public static boolean vanillaLoginPacketCompatibility() + { + return FMLCommonHandler.instance().getSidedDelegate().getClientCompatibilityLevel() == 0; + } } \ No newline at end of file diff --git a/common/cpw/mods/fml/common/network/ModListRequestPacket.java b/common/cpw/mods/fml/common/network/ModListRequestPacket.java index 080ae4c801..f2cf683a18 100644 --- a/common/cpw/mods/fml/common/network/ModListRequestPacket.java +++ b/common/cpw/mods/fml/common/network/ModListRequestPacket.java @@ -61,7 +61,7 @@ public class ModListRequestPacket extends FMLPacket { compatibilityLevel = in.readByte(); } - catch (IllegalArgumentException e) + catch (IllegalStateException e) { FMLLog.fine("No compatibility byte found - the server is too old"); } @@ -110,16 +110,9 @@ public class ModListRequestPacket extends FMLPacket } } - if (compatibilityLevel != 0) - { - FMLLog.fine("The server has compatibility level %d", compatibilityLevel); - FMLCommonHandler.instance().getSidedDelegate().setCompatibilityLevel(netHandler, compatibilityLevel); - } - Packet250CustomPayload pkt = new Packet250CustomPayload(); - pkt.field_73630_a = "FML"; - pkt.field_73629_c = FMLPacket.makePacket(MOD_LIST_RESPONSE, modVersions, missingMods); - pkt.field_73628_b = pkt.field_73629_c.length; + FMLLog.fine("The server has compatibility level %d", compatibilityLevel); + FMLCommonHandler.instance().getSidedDelegate().setClientCompatibilityLevel(compatibilityLevel); - mgr.func_74429_a(pkt); + mgr.func_74429_a(PacketDispatcher.getPacket("FML", FMLPacket.makePacket(MOD_LIST_RESPONSE, modVersions, missingMods))); } } diff --git a/common/cpw/mods/fml/server/FMLServerHandler.java b/common/cpw/mods/fml/server/FMLServerHandler.java index 1500b0c979..e2c20c0aa5 100644 --- a/common/cpw/mods/fml/server/FMLServerHandler.java +++ b/common/cpw/mods/fml/server/FMLServerHandler.java @@ -16,6 +16,7 @@ import java.util.List; import net.minecraft.server.MinecraftServer; import net.minecraft.src.Entity; +import net.minecraft.src.NetClientHandler; import net.minecraft.src.NetHandler; import net.minecraft.src.Packet; import net.minecraft.src.Packet131MapData; @@ -164,8 +165,15 @@ public class FMLServerHandler implements IFMLSidedHandler // NOOP on server } @Override - public void setCompatibilityLevel(NetHandler netHandler, byte compatibilityLevel) + public void setClientCompatibilityLevel(byte compatibilityLevel) { // NOOP on server } + @Override + public byte getClientCompatibilityLevel() + { + System.out.printf("Server Compatibility %d\n", 0); + Thread.dumpStack(); + return 0; + } } diff --git a/patches/common/net/minecraft/src/Packet1Login.java.patch b/patches/common/net/minecraft/src/Packet1Login.java.patch new file mode 100644 index 0000000000..0dcbffd2ee --- /dev/null +++ b/patches/common/net/minecraft/src/Packet1Login.java.patch @@ -0,0 +1,72 @@ +--- ../src-base/common/net/minecraft/src/Packet1Login.java ++++ ../src-work/common/net/minecraft/src/Packet1Login.java +@@ -3,6 +3,8 @@ + import java.io.DataInputStream; + import java.io.DataOutputStream; + import java.io.IOException; ++ ++import cpw.mods.fml.common.network.FMLNetworkHandler; + + public class Packet1Login extends Packet + { +@@ -15,7 +17,11 @@ + public byte field_73556_g; + public byte field_73562_h; + +- public Packet1Login() {} ++ private boolean vanillaCompatible; ++ ++ public Packet1Login() { ++ this.vanillaCompatible = FMLNetworkHandler.vanillaLoginPacketCompatibility(); ++ } + + public Packet1Login(int p_i3327_1_, WorldType p_i3327_2_, EnumGameType p_i3327_3_, boolean p_i3327_4_, int p_i3327_5_, int p_i3327_6_, int p_i3327_7_, int p_i3327_8_) + { +@@ -27,6 +33,7 @@ + this.field_73556_g = (byte)p_i3327_7_; + this.field_73562_h = (byte)p_i3327_8_; + this.field_73560_c = p_i3327_4_; ++ this.vanillaCompatible = false; + } + + public void func_73267_a(DataInputStream p_73267_1_) throws IOException +@@ -44,7 +51,14 @@ + this.field_73560_c = (var3 & 8) == 8; + int var4 = var3 & -9; + this.field_73557_d = EnumGameType.func_77146_a(var4); +- this.field_73558_e = p_73267_1_.readByte(); ++ if (vanillaCompatible) ++ { ++ this.field_73558_e = p_73267_1_.readByte(); ++ } ++ else ++ { ++ this.field_73558_e = p_73267_1_.readShort(); ++ } + this.field_73555_f = p_73267_1_.readByte(); + this.field_73556_g = p_73267_1_.readByte(); + this.field_73562_h = p_73267_1_.readByte(); +@@ -62,7 +76,14 @@ + } + + p_73273_1_.writeByte(var2); +- p_73273_1_.writeByte(this.field_73558_e); ++ if (vanillaCompatible) ++ { ++ p_73273_1_.writeByte(this.field_73558_e); ++ } ++ else ++ { ++ p_73273_1_.writeShort(this.field_73558_e); ++ } + p_73273_1_.writeByte(this.field_73555_f); + p_73273_1_.writeByte(this.field_73556_g); + p_73273_1_.writeByte(this.field_73562_h); +@@ -82,6 +103,6 @@ + var1 = this.field_73559_b.func_77127_a().length(); + } + +- return 6 + 2 * var1 + 4 + 4 + 1 + 1 + 1; ++ return 6 + 2 * var1 + 4 + 4 + 1 + 1 + 1 + (vanillaCompatible ? 0 : 1); + } + } diff --git a/patches/minecraft/net/minecraft/src/NetClientHandler.java.patch b/patches/minecraft/net/minecraft/src/NetClientHandler.java.patch index aa6a5aacbd..e5ffeaef8f 100644 --- a/patches/minecraft/net/minecraft/src/NetClientHandler.java.patch +++ b/patches/minecraft/net/minecraft/src/NetClientHandler.java.patch @@ -13,7 +13,7 @@ public int field_72556_d = 20; Random field_72557_e = new Random(); -+ public int connectionCompatibilityLevel; ++ private static byte connectionCompatibilityLevel; + public NetClientHandler(Minecraft p_i3103_1_, String p_i3103_2_, int p_i3103_3_) throws IOException { @@ -91,12 +91,12 @@ + return field_72563_h.field_71439_g; + } + -+ public void setConnectionCompatibilityLevel(int connectionCompatibilityLevel) ++ public static void setConnectionCompatibilityLevel(byte connectionCompatibilityLevel) + { -+ this.connectionCompatibilityLevel = connectionCompatibilityLevel; ++ NetClientHandler.connectionCompatibilityLevel = connectionCompatibilityLevel; + } + -+ public int getConnectionCompatibilityLevel() ++ public static byte getConnectionCompatibilityLevel() + { + return connectionCompatibilityLevel; + }