From 4dac5fc704f8342e0d85ab116d996115343e2cfa Mon Sep 17 00:00:00 2001 From: md_5 Date: Sat, 28 Sep 2013 18:35:51 +1000 Subject: [PATCH] Snapshot Protocol diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java index 36eca0f..c90c65e 100644 --- a/src/main/java/net/minecraft/server/EntityHuman.java +++ b/src/main/java/net/minecraft/server/EntityHuman.java @@ -63,6 +63,7 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen protected float bL = 0.02F; private int h; public EntityFishingHook hookedFish; + public String playerUUID; // Spigot public EntityHuman(World world, String s) { super(world); diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java index fb8bc87..5651bd0 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -764,7 +764,7 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo } public String getVersion() { - return "1.6.4"; + return org.spigotmc.SpigotConfig.gameVersion; // Spigot } public int A() { diff --git a/src/main/java/net/minecraft/server/Packet200Statistic.java b/src/main/java/net/minecraft/server/Packet200Statistic.java new file mode 100644 index 0000000..a850473 --- /dev/null +++ b/src/main/java/net/minecraft/server/Packet200Statistic.java @@ -0,0 +1,49 @@ +package net.minecraft.server; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class Packet200Statistic extends Packet { + + public int a; + public int b; + + public Packet200Statistic() {} + + public Packet200Statistic(int i, int j) { + this.a = i; + this.b = j; + } + + public void handle(Connection connection) { + connection.a(this); + } + + public void a(DataInput datainput) throws IOException { + this.a = datainput.readInt(); + this.b = datainput.readInt(); + } + + public void a(DataOutput dataoutput) throws IOException { + // Spigot Start + if ( org.spigotmc.SpigotConfig.snapshotProtocol ) + { + dataoutput.writeInt( 1 ); + a( ( (Statistic) StatisticList.a.get( this.a ) ).g, dataoutput ); + dataoutput.writeInt( this.b ); + return; + } + // Spigot End + dataoutput.writeInt(this.a); + dataoutput.writeInt(this.b); + } + + public int a() { + return 6; + } + + public boolean a_() { + return true; + } +} diff --git a/src/main/java/net/minecraft/server/Packet20NamedEntitySpawn.java b/src/main/java/net/minecraft/server/Packet20NamedEntitySpawn.java index 1843d9c..aeb42bb 100644 --- a/src/main/java/net/minecraft/server/Packet20NamedEntitySpawn.java +++ b/src/main/java/net/minecraft/server/Packet20NamedEntitySpawn.java @@ -8,6 +8,7 @@ import java.io.IOException; // CraftBukkit public class Packet20NamedEntitySpawn extends Packet { + public String playerUUID; // Spigot public int a; public String b; public int c; @@ -23,6 +24,7 @@ public class Packet20NamedEntitySpawn extends Packet { public Packet20NamedEntitySpawn(EntityHuman entityhuman) { this.a = entityhuman.id; + this.playerUUID = entityhuman.playerUUID; // Spigot // CraftBukkit start - Limit name length to 16 characters if (entityhuman.name.length() > 16) { @@ -58,6 +60,7 @@ public class Packet20NamedEntitySpawn extends Packet { public void a(DataOutput dataoutput) throws IOException { // CraftBukkit dataoutput.writeInt(this.a); + if ( this.playerUUID != null ) a( playerUUID, dataoutput ); // Spigot a(this.b, dataoutput); dataoutput.writeInt(this.c); dataoutput.writeInt(this.d); diff --git a/src/main/java/net/minecraft/server/Packet62NamedSoundEffect.java b/src/main/java/net/minecraft/server/Packet62NamedSoundEffect.java new file mode 100644 index 0000000..9b64483 --- /dev/null +++ b/src/main/java/net/minecraft/server/Packet62NamedSoundEffect.java @@ -0,0 +1,60 @@ +package net.minecraft.server; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class Packet62NamedSoundEffect extends Packet { + + private String a; + private int b; + private int c = Integer.MAX_VALUE; + private int d; + private float e; + private int f; + + public Packet62NamedSoundEffect() {} + + public Packet62NamedSoundEffect(String s, double d0, double d1, double d2, float f, float f1) { + this.a = s; + this.b = (int) (d0 * 8.0D); + this.c = (int) (d1 * 8.0D); + this.d = (int) (d2 * 8.0D); + this.e = f; + this.f = (int) (f1 * 63.0F); + if (this.f < 0) { + this.f = 0; + } + + if (this.f > 255) { + this.f = 255; + } + } + + public void a(DataInput datainput) throws IOException { + this.a = a(datainput, 256); + this.b = datainput.readInt(); + this.c = datainput.readInt(); + this.d = datainput.readInt(); + this.e = datainput.readFloat(); + this.f = datainput.readUnsignedByte(); + } + + public void a(DataOutput dataoutput) throws IOException { + a(this.a, dataoutput); + dataoutput.writeInt(this.b); + dataoutput.writeInt(this.c); + dataoutput.writeInt(this.d); + dataoutput.writeFloat(this.e); + dataoutput.writeByte(this.f); + if ( org.spigotmc.SpigotConfig.snapshotProtocol ) dataoutput.writeByte( 0 ); // Spigot + } + + public void handle(Connection connection) { + connection.a(this); + } + + public int a() { + return 24; + } +} diff --git a/src/main/java/net/minecraft/server/Packet70Bed.java b/src/main/java/net/minecraft/server/Packet70Bed.java new file mode 100644 index 0000000..ff89531 --- /dev/null +++ b/src/main/java/net/minecraft/server/Packet70Bed.java @@ -0,0 +1,37 @@ +package net.minecraft.server; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +public class Packet70Bed extends Packet { + + public static final String[] a = new String[] { "tile.bed.notValid", null, null, "gameMode.changed"}; + public int b; + public int c; + + public Packet70Bed() {} + + public Packet70Bed(int i, int j) { + this.b = i; + this.c = j; + } + + public void a(DataInput datainput) throws IOException { + this.b = datainput.readByte(); + this.c = datainput.readByte(); + } + + public void a(DataOutput dataoutput) throws IOException { + dataoutput.writeByte(this.b); + if ( org.spigotmc.SpigotConfig.snapshotProtocol ) dataoutput.writeFloat(this.c); else dataoutput.writeByte(this.c); // Spigot + } + + public void handle(Connection connection) { + connection.a(this); + } + + public int a() { + return 2; + } +} diff --git a/src/main/java/net/minecraft/server/PendingConnection.java b/src/main/java/net/minecraft/server/PendingConnection.java index 358cba4..a86fbbc 100644 --- a/src/main/java/net/minecraft/server/PendingConnection.java +++ b/src/main/java/net/minecraft/server/PendingConnection.java @@ -25,6 +25,7 @@ public class PendingConnection extends Connection { private boolean j; private SecretKey k; public String hostname = ""; // CraftBukkit - add field + public String playerUUID; public PendingConnection(MinecraftServer minecraftserver, org.spigotmc.netty.NettyNetworkManager networkManager) { this.server = minecraftserver; @@ -78,8 +79,8 @@ public class PendingConnection extends Connection { } else { PublicKey publickey = this.server.H().getPublic(); - if (packet2handshake.d() != 78) { - if (packet2handshake.d() > 78) { + if (packet2handshake.d() != org.spigotmc.SpigotConfig.protocolVersion) { // Spigot + if (packet2handshake.d() > org.spigotmc.SpigotConfig.protocolVersion) { // Spigot this.disconnect(org.spigotmc.SpigotConfig.outdatedServerMessage); // Spigot } else { this.disconnect(org.spigotmc.SpigotConfig.outdatedClientMessage); // Spigot @@ -133,6 +134,7 @@ public class PendingConnection extends Connection { // CraftBukkit end } else { EntityPlayer entityplayer = this.server.getPlayerList().processLogin(s); // CraftBukkit - this.g -> s + entityplayer.playerUUID = this.playerUUID; // Spigot if (entityplayer != null) { this.server.getPlayerList().a((INetworkManager) this.networkManager, entityplayer); @@ -159,7 +161,7 @@ public class PendingConnection extends Connection { s = pingEvent.getMotd() + "\u00A7" + playerlist.getPlayerCount() + "\u00A7" + pingEvent.getMaxPlayers(); } else { // CraftBukkit start - Don't create a list from an array - Object[] list = new Object[] { 1, 78, this.server.getVersion(), pingEvent.getMotd(), playerlist.getPlayerCount(), pingEvent.getMaxPlayers() }; + Object[] list = new Object[] { 1, org.spigotmc.SpigotConfig.protocolVersion, this.server.getVersion(), pingEvent.getMotd(), playerlist.getPlayerCount(), pingEvent.getMaxPlayers() }; // Spigot StringBuilder builder = new StringBuilder(); for (Object object : list) { diff --git a/src/main/java/net/minecraft/server/ThreadLoginVerifier.java b/src/main/java/net/minecraft/server/ThreadLoginVerifier.java index 70f9fea..2d0c1f9 100644 --- a/src/main/java/net/minecraft/server/ThreadLoginVerifier.java +++ b/src/main/java/net/minecraft/server/ThreadLoginVerifier.java @@ -26,9 +26,39 @@ class ThreadLoginVerifier extends Thread { // CraftBukkit end this.pendingConnection = pendingconnection; } + + // Spigot Start + public static class NewResponse + { - private boolean auth() throws java.io.IOException { - String s = (new BigInteger(MinecraftEncryption.a(PendingConnection.a(this.pendingConnection), PendingConnection.b(this.pendingConnection).H().getPublic(), PendingConnection.c(this.pendingConnection)))).toString(16); + private String id; + } + // Spigot End + + private boolean auth() throws java.io.IOException + { + // Spigot Start + if ( org.spigotmc.SpigotConfig.snapshotProtocol ) + { + String url = "https://sessionserver.mojang.com/session/minecraft/hasJoined?username=" + URLEncoder.encode( PendingConnection.d( this.pendingConnection ), "UTF-8" ) + "&serverId=" + URLEncoder.encode( PendingConnection.a( pendingConnection ), "UTF-8" ); + BufferedReader br = new BufferedReader( new InputStreamReader( new URL( url ).openConnection( PendingConnection.b( this.pendingConnection ).ap() ).getInputStream() ) ); + String s = br.readLine(); + br.close(); + NewResponse response = new com.google.gson.Gson().fromJson( s, NewResponse.class ); + if ( response != null ) + { + if ( response.id != null ) + { + this.pendingConnection.playerUUID = response.id; + return true; + } + } + this.pendingConnection.disconnect( "Failed to verify username!" ); + return false; + } + // Spigot End + + String s = ( new BigInteger( MinecraftEncryption.a( PendingConnection.a(this.pendingConnection), PendingConnection.b(this.pendingConnection).H().getPublic(), PendingConnection.c(this.pendingConnection)))).toString(16); URL url = new URL("http://session.minecraft.net/game/checkserver.jsp?user=" + URLEncoder.encode(PendingConnection.d(this.pendingConnection), "UTF-8") + "&serverId=" + URLEncoder.encode(s, "UTF-8")); BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(url.openConnection(PendingConnection.b(this.pendingConnection).ap()).getInputStream())); String s1 = bufferedreader.readLine(); diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java index 296c581..686e82c 100644 --- a/src/main/java/org/spigotmc/SpigotConfig.java +++ b/src/main/java/org/spigotmc/SpigotConfig.java @@ -290,4 +290,22 @@ public class SpigotConfig Bukkit.getLogger().setFilter( new LogFilter() ); } + + public static boolean snapshotProtocol; + public static String gameVersion; + public static byte protocolVersion; + private static void snapshotProtocol() + { + snapshotProtocol = getBoolean( "settings.snapshot-protocol", false ); +snapshotProtocol = true; + gameVersion = ( snapshotProtocol ) ? "13w39b" : "1.6.4"; + protocolVersion = (byte) ( ( snapshotProtocol ) ? 80 : 78 ); + if ( snapshotProtocol ) + { + Bukkit.getLogger().severe( "================ [Snapshot Protocol] ================" ); + Bukkit.getLogger().severe( "Initialised Snapshot Protocol for " + gameVersion + " (" + protocolVersion + ")" ); + Bukkit.getLogger().severe( "Features may NOT be implemented! Use at your own risk!" ); + Bukkit.getLogger().severe( "================ ====================================" ); + } + } } -- 1.8.1.2