papermc/CraftBukkit-Patches/0073-Snapshot-Protocol.patch
2013-09-28 18:36:05 +10:00

339 lines
13 KiB
Diff

From 6dad765f629a338297b6d7b95ad5bb64ee31c073 Mon Sep 17 00:00:00 2001
From: md_5 <md_5@live.com.au>
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..8e9dc94
--- /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( (String) StatisticList.a.get( this.a ), 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