339 lines
13 KiB
Diff
339 lines
13 KiB
Diff
From 4dac5fc704f8342e0d85ab116d996115343e2cfa 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..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
|
|
|