From af89e32891c1b2b4be699afe3bdae190e1c4babb Mon Sep 17 00:00:00 2001 From: Thinkofdeath Date: Thu, 3 Apr 2014 17:04:18 +0100 Subject: [PATCH] 1.7.6-pre1 support diff --git a/pom.xml b/pom.xml index c8285e0..21876f0 100644 --- a/pom.xml +++ b/pom.xml @@ -31,6 +31,10 @@ repobo-snap http://repo.bukkit.org/content/groups/public + + vanilla + https://libraries.minecraft.net/ + @@ -114,6 +118,21 @@ trove4j 3.0.3 + + org.apache.commons + commons-lang3 + 3.2.1 + + + commons-io + commons-io + 2.4 + + + com.mojang + authlib + 1.5.5 + diff --git a/src/main/java/net/minecraft/server/HandshakeListener.java b/src/main/java/net/minecraft/server/HandshakeListener.java index 42539b4..490123f 100644 --- a/src/main/java/net/minecraft/server/HandshakeListener.java +++ b/src/main/java/net/minecraft/server/HandshakeListener.java @@ -1,5 +1,6 @@ package net.minecraft.server; +import net.minecraft.util.io.netty.util.AttributeKey; import net.minecraft.util.io.netty.util.concurrent.GenericFutureListener; // CraftBukkit start @@ -13,6 +14,7 @@ public class HandshakeListener implements PacketHandshakingInListener { private static final HashMap throttleTracker = new HashMap(); private static int throttleCounter = 0; // CraftBukkit end + public static final AttributeKey protocolVersion = new AttributeKey( "protocolVersion" ); // Spigot private final MinecraftServer a; private final NetworkManager b; @@ -23,6 +25,12 @@ public class HandshakeListener implements PacketHandshakingInListener { } public void a(PacketHandshakingInSetProtocol packethandshakinginsetprotocol) { + // Spigot start + b.m.attr( protocolVersion ).set( 4 ); + if (packethandshakinginsetprotocol.d() == 5) { + b.m.attr( protocolVersion ).set( 5 ); + } + // Spigot end switch (ProtocolOrdinalWrapper.a[packethandshakinginsetprotocol.c().ordinal()]) { case 1: this.b.a(EnumProtocol.LOGIN); @@ -62,8 +70,7 @@ public class HandshakeListener implements PacketHandshakingInListener { org.apache.logging.log4j.LogManager.getLogger().debug("Failed to check connection throttle", t); } // CraftBukkit end - - if (packethandshakinginsetprotocol.d() > 4) { + if (packethandshakinginsetprotocol.d() > 5) { // Spigot chatcomponenttext = new ChatComponentText( org.spigotmc.SpigotConfig.outdatedServerMessage ); // Spigot this.b.handle(new PacketLoginOutDisconnect(chatcomponenttext), new GenericFutureListener[0]); this.b.close(chatcomponenttext); diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java index 8ce9dd7..b95123c 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -17,6 +17,7 @@ import java.util.UUID; import java.util.concurrent.Callable; import javax.imageio.ImageIO; +import com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService; import net.minecraft.util.com.google.common.base.Charsets; import net.minecraft.util.com.mojang.authlib.GameProfile; import net.minecraft.util.com.mojang.authlib.minecraft.MinecraftSessionService; @@ -107,6 +108,7 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo private static final int TICK_TIME = 1000000000 / TPS; private static final int SAMPLE_INTERVAL = 100; public final double[] recentTps = new double[ 3 ]; + public final com.mojang.authlib.minecraft.MinecraftSessionService newSessionService; // Spigot end public MinecraftServer(OptionSet options, Proxy proxy) { // CraftBukkit - signature file -> OptionSet @@ -117,6 +119,7 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo this.n = new CommandDispatcher(); // this.convertable = new WorldLoaderServer(file1); // CraftBukkit - moved to DedicatedServer.init this.S = (new YggdrasilAuthenticationService(proxy, UUID.randomUUID().toString())).createMinecraftSessionService(); + newSessionService = new com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService(proxy, UUID.randomUUID().toString()).createMinecraftSessionService(); // CraftBukkit start this.options = options; diff --git a/src/main/java/net/minecraft/server/NetworkManager.java b/src/main/java/net/minecraft/server/NetworkManager.java index f6cca80..56bfe34 100644 --- a/src/main/java/net/minecraft/server/NetworkManager.java +++ b/src/main/java/net/minecraft/server/NetworkManager.java @@ -35,7 +35,7 @@ public class NetworkManager extends SimpleChannelInboundHandler { private final boolean j; private final Queue k = Queues.newConcurrentLinkedQueue(); private final Queue l = Queues.newConcurrentLinkedQueue(); - private Channel m; + public Channel m; // Spigot public SocketAddress n; // Spigot public String spoofedUUID; // Spigot private PacketListener o; diff --git a/src/main/java/net/minecraft/server/Packet.java b/src/main/java/net/minecraft/server/Packet.java index 592ffc5..190da32 100644 --- a/src/main/java/net/minecraft/server/Packet.java +++ b/src/main/java/net/minecraft/server/Packet.java @@ -47,6 +47,12 @@ public abstract class Packet { public abstract void b(PacketDataSerializer packetdataserializer) throws IOException; // CraftBukkit - added throws + // Spigot start + public void writeSnapshot(PacketDataSerializer packetDataSerializer) throws IOException { + b( packetDataSerializer ); + } + // Spigot end + public abstract void handle(PacketListener packetlistener); public boolean a() { diff --git a/src/main/java/net/minecraft/server/PacketEncoder.java b/src/main/java/net/minecraft/server/PacketEncoder.java new file mode 100644 index 0000000..ab00152 --- /dev/null +++ b/src/main/java/net/minecraft/server/PacketEncoder.java @@ -0,0 +1,52 @@ +package net.minecraft.server; + +import java.io.IOException; + +import net.minecraft.util.com.google.common.collect.BiMap; +import net.minecraft.util.io.netty.buffer.ByteBuf; +import net.minecraft.util.io.netty.channel.ChannelHandlerContext; +import net.minecraft.util.io.netty.handler.codec.MessageToByteEncoder; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.Marker; +import org.apache.logging.log4j.MarkerManager; + +public class PacketEncoder extends MessageToByteEncoder { + + private static final Logger a = LogManager.getLogger(); + private static final Marker b = MarkerManager.getMarker("PACKET_SENT", NetworkManager.b); + private final NetworkStatistics c; + + public PacketEncoder(NetworkStatistics networkstatistics) { + this.c = networkstatistics; + } + + protected void a(ChannelHandlerContext channelhandlercontext, Packet packet, ByteBuf bytebuf) throws IOException + { + Integer integer = (Integer) ((BiMap) channelhandlercontext.channel().attr(NetworkManager.f).get()).inverse().get(packet.getClass()); + + if (a.isDebugEnabled()) { + a.debug(b, "OUT: [{}:{}] {}[{}]", new Object[] { channelhandlercontext.channel().attr(NetworkManager.d).get(), integer, packet.getClass().getName(), packet.b()}); + } + + if (integer == null) { + throw new IOException("Can\'t serialize unregistered packet"); + } else { + PacketDataSerializer packetdataserializer = new PacketDataSerializer(bytebuf); + + packetdataserializer.b(integer.intValue()); + if ( channelhandlercontext.channel().attr( HandshakeListener.protocolVersion ).get() == 4) + { + packet.b( packetdataserializer ); + } else { + packet.writeSnapshot( packetdataserializer ); + } + this.c.b(integer.intValue(), (long) packetdataserializer.readableBytes()); + } + } + + protected void encode(ChannelHandlerContext channelhandlercontext, Object object, ByteBuf bytebuf) throws IOException + { + this.a(channelhandlercontext, (Packet) object, bytebuf); + } +} diff --git a/src/main/java/net/minecraft/server/PacketLoginOutSuccess.java b/src/main/java/net/minecraft/server/PacketLoginOutSuccess.java new file mode 100644 index 0000000..3aa93cd --- /dev/null +++ b/src/main/java/net/minecraft/server/PacketLoginOutSuccess.java @@ -0,0 +1,51 @@ +package net.minecraft.server; + +import net.minecraft.util.com.mojang.authlib.GameProfile; + +import java.io.IOException; + +public class PacketLoginOutSuccess extends Packet { + + private GameProfile a; + + public PacketLoginOutSuccess() {} + + public PacketLoginOutSuccess(GameProfile gameprofile) { + this.a = gameprofile; + } + + public void a(PacketDataSerializer packetdataserializer) throws IOException + { + String s = packetdataserializer.c(36); + String s1 = packetdataserializer.c(16); + + this.a = new GameProfile(s, s1); + } + + public void b(PacketDataSerializer packetdataserializer) throws IOException + { + packetdataserializer.a(this.a.getId()); + packetdataserializer.a(this.a.getName()); + } + + // Spigot start + @Override + public void writeSnapshot(PacketDataSerializer packetdataserializer) throws IOException + { + packetdataserializer.a( EntityHuman.a( this.a ).toString() ); + packetdataserializer.a( this.a.getName()); + } + // Spigot end + + public void a(PacketLoginOutListener packetloginoutlistener) { + packetloginoutlistener.a(this); + } + + public boolean a() { + return true; + } + + public void handle(PacketListener packetlistener) { + this.a((PacketLoginOutListener) packetlistener); + } +} diff --git a/src/main/java/net/minecraft/server/PacketPlayOutNamedEntitySpawn.java b/src/main/java/net/minecraft/server/PacketPlayOutNamedEntitySpawn.java index 8bab528..01630be 100644 --- a/src/main/java/net/minecraft/server/PacketPlayOutNamedEntitySpawn.java +++ b/src/main/java/net/minecraft/server/PacketPlayOutNamedEntitySpawn.java @@ -2,6 +2,7 @@ package net.minecraft.server; import java.util.List; +import com.mojang.authlib.properties.Property; import net.minecraft.util.com.mojang.authlib.GameProfile; import java.io.IOException; // CraftBukkit @@ -60,6 +61,41 @@ public class PacketPlayOutNamedEntitySpawn extends Packet { this.i.a(packetdataserializer); } + // Spigot start + @Override + public void writeSnapshot(PacketDataSerializer packetdataserializer) throws IOException + { // CraftBukkit - added throws + packetdataserializer.b( this.a ); + packetdataserializer.a( EntityHuman.a( this.b ).toString() ); + packetdataserializer.a( this.b.getName().length() > 16 ? this.b.getName().substring( 0, 16 ) : this.b.getName() ); // CraftBukkit - Limit name length to 16 characters + + if ( this.b instanceof ThreadPlayerLookupUUID.NewGameProfileWrapper ) + { + com.mojang.authlib.GameProfile newProfile = ((ThreadPlayerLookupUUID.NewGameProfileWrapper) b).newProfile; + packetdataserializer.b( newProfile.getProperties().size() ); + for ( String key : newProfile.getProperties().keys() ) + { + for ( Property prop : newProfile.getProperties().get( key ) ) + { + packetdataserializer.a( prop.getName() ); + packetdataserializer.a( prop.getValue() ); + packetdataserializer.a( prop.getSignature() ); + } + } + } else { + packetdataserializer.b( 0 ); + } + packetdataserializer.writeInt( this.c ); + packetdataserializer.writeInt( this.d ); + packetdataserializer.writeInt( this.e ); + packetdataserializer.writeByte( this.f ); + packetdataserializer.writeByte( this.g ); + packetdataserializer.writeShort( this.h ); + this.i.a( packetdataserializer ); + } + + // Spigot end + public void a(PacketPlayOutListener packetplayoutlistener) { packetplayoutlistener.a(this); } diff --git a/src/main/java/net/minecraft/server/PacketPlayOutTileEntityData.java b/src/main/java/net/minecraft/server/PacketPlayOutTileEntityData.java new file mode 100644 index 0000000..005f1fe --- /dev/null +++ b/src/main/java/net/minecraft/server/PacketPlayOutTileEntityData.java @@ -0,0 +1,61 @@ +package net.minecraft.server; + +public class PacketPlayOutTileEntityData extends Packet { + + private int a; + private int b; + private int c; + private int d; + private NBTTagCompound e; + + public PacketPlayOutTileEntityData() {} + + public PacketPlayOutTileEntityData(int i, int j, int k, int l, NBTTagCompound nbttagcompound) { + this.a = i; + this.b = j; + this.c = k; + this.d = l; + this.e = nbttagcompound; + } + + public void a(PacketDataSerializer packetdataserializer) { + this.a = packetdataserializer.readInt(); + this.b = packetdataserializer.readShort(); + this.c = packetdataserializer.readInt(); + this.d = packetdataserializer.readUnsignedByte(); + this.e = packetdataserializer.b(); + } + + public void b(PacketDataSerializer packetdataserializer) { + packetdataserializer.writeInt(this.a); + packetdataserializer.writeShort(this.b); + packetdataserializer.writeInt(this.c); + packetdataserializer.writeByte((byte) this.d); + packetdataserializer.a(this.e); + } + + @Override + public void writeSnapshot(PacketDataSerializer packetdataserializer) + { + packetdataserializer.writeInt(this.a); + packetdataserializer.writeShort(this.b); + packetdataserializer.writeInt(this.c); + packetdataserializer.writeByte((byte) this.d); + if ( this.e.hasKey( "ExtraType" ) ) + { + NBTTagCompound profile = new NBTTagCompound(); + profile.setString( "Name", this.e.getString( "ExtraType" ) ); + profile.setString( "Id", "" ); + this.e.set( "Owner", profile ); + } + packetdataserializer.a(this.e); + } + + public void a(PacketPlayOutListener packetplayoutlistener) { + packetplayoutlistener.a(this); + } + + public void handle(PacketListener packetlistener) { + this.a((PacketPlayOutListener) packetlistener); + } +} diff --git a/src/main/java/net/minecraft/server/PacketStatusListener.java b/src/main/java/net/minecraft/server/PacketStatusListener.java index f9da452..fa493ca 100644 --- a/src/main/java/net/minecraft/server/PacketStatusListener.java +++ b/src/main/java/net/minecraft/server/PacketStatusListener.java @@ -4,6 +4,7 @@ import java.net.InetSocketAddress; // CraftBukkit start import java.util.Iterator; +import java.util.UUID; import org.bukkit.craftbukkit.util.CraftIconCache; import org.bukkit.entity.Player; @@ -117,13 +118,22 @@ public class PacketStatusListener implements PacketStatusInListener { profiles = profiles.subList( 0, Math.min( profiles.size(), org.spigotmc.SpigotConfig.playerSample ) ); // Cap the sample to n (or less) displayed players, ie: Vanilla behaviour } // Spigot End - playerSample.a(profiles.toArray(new GameProfile[profiles.size()])); + // Spigot start + GameProfile[] aProfiles = profiles.toArray( new GameProfile[ profiles.size() ] ); + if ( networkManager.m.attr( HandshakeListener.protocolVersion ).get() == 5 ) + { + for (int i = 0; i < aProfiles.length; i++) { + aProfiles[i] = new GameProfileWrapper( EntityHuman.a( aProfiles[i] ), aProfiles[i].getName() ); + } + } + // Spigot end + playerSample.a(aProfiles); ServerPing ping = new ServerPing(); ping.setFavicon(event.icon.value); ping.setMOTD(new ChatComponentText(event.getMotd())); ping.setPlayerSample(playerSample); - ping.setServerInfo(new ServerPingServerData(minecraftServer.getServerModName() + " " + minecraftServer.getVersion(), 4)); // TODO: Update when protocol changes + ping.setServerInfo(new ServerPingServerData(minecraftServer.getServerModName() + " " + minecraftServer.getVersion(), networkManager.m.attr( HandshakeListener.protocolVersion ).get())); // Spigot // TODO: Update when protocol changes this.networkManager.handle(new PacketStatusOutServerInfo(ping), new GenericFutureListener[0]); // CraftBukkit end @@ -132,4 +142,23 @@ public class PacketStatusListener implements PacketStatusInListener { public void a(PacketStatusInPing packetstatusinping) { this.networkManager.handle(new PacketStatusOutPong(packetstatusinping.c()), new GenericFutureListener[0]); } + + + // Spigot start + private static class GameProfileWrapper extends GameProfile { + + private final UUID uuid; + + public GameProfileWrapper(UUID uuid, String name) { + super("", name); + this.uuid = uuid; + } + + @Override + public String getId() { + return uuid.toString(); + } + } + + // Spigot end } diff --git a/src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java b/src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java index fe4502a..0649ccf 100644 --- a/src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java +++ b/src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java @@ -33,7 +33,9 @@ class ThreadPlayerLookupUUID extends Thread { } // Spigot End String s = (new BigInteger(MinecraftEncryption.a(LoginListener.a(this.a), LoginListener.b(this.a).J().getPublic(), LoginListener.c(this.a)))).toString(16); - LoginListener.a(this.a, LoginListener.b(this.a).at().hasJoinedServer(new GameProfile((String) null, LoginListener.d(this.a).getName()), s)); + //LoginListener.a(this.a, LoginListener.b(this.a).at().hasJoinedServer(new GameProfile((String) null, LoginListener.d(this.a).getName()), s)); + com.mojang.authlib.GameProfile profile = LoginListener.b(this.a).newSessionService.hasJoinedServer( new com.mojang.authlib.GameProfile( null, LoginListener.d(this.a).getName() ), s ); + LoginListener.a(this.a, new NewGameProfileWrapper( profile ) ); if (LoginListener.d(this.a) != null) { // Spigot Start fireLoginEvents(); @@ -95,4 +97,15 @@ class ThreadPlayerLookupUUID extends Thread { } // CraftBukkit end } + + public static class NewGameProfileWrapper extends GameProfile { + + public com.mojang.authlib.GameProfile newProfile; + + public NewGameProfileWrapper(com.mojang.authlib.GameProfile newProfile) + { + super( newProfile.getId().toString().replaceAll( "-", "" ), newProfile.getName() ); + this.newProfile = newProfile; + } + } } -- 1.8.5.2.msysgit.0