From fefdcc3612ce57fa2de285b6443c550e18a2aaf8 Mon Sep 17 00:00:00 2001 From: Sen Date: Thu, 5 Jun 2025 15:32:03 +0200 Subject: [PATCH] make player list and skins proxy sided --- proxy/src/main/java/proxy/Proxy.java | 67 +++- .../main/java/proxy/handler/ProxyHandler.java | 103 +++--- .../proxy/packet/C16PacketClientStatus.java | 7 + .../packet/C19PacketResourcePackStatus.java | 50 +-- proxy/src/main/java/proxy/packet/Profile.java | 58 --- .../java/proxy/packet/S07PacketRespawn.java | 5 + .../packet/S2BPacketChangeGameState.java | 22 +- .../proxy/packet/S38PacketPlayerListItem.java | 340 ++++++++---------- .../packet/S3BPacketScoreboardObjective.java | 21 +- .../proxy/packet/S3CPacketUpdateScore.java | 23 +- .../packet/S3DPacketDisplayScoreboard.java | 9 +- .../java/proxy/packet/S3EPacketTeams.java | 26 +- .../proxy/packet/S42PacketCombatEvent.java | 93 ++--- .../S47PacketPlayerListHeaderFooter.java | 9 +- .../packet/S48PacketResourcePackSend.java | 9 +- proxy/src/main/java/proxy/util/User.java | 2 + 16 files changed, 425 insertions(+), 419 deletions(-) delete mode 100644 proxy/src/main/java/proxy/packet/Profile.java diff --git a/proxy/src/main/java/proxy/Proxy.java b/proxy/src/main/java/proxy/Proxy.java index 8037ef8..d3c4722 100755 --- a/proxy/src/main/java/proxy/Proxy.java +++ b/proxy/src/main/java/proxy/Proxy.java @@ -59,12 +59,15 @@ import proxy.network.Decoder; import proxy.network.Splitter; import proxy.network.Encoder; import proxy.network.EventLoopLoader; +import proxy.network.Packet; import proxy.network.Prepender; import proxy.command.*; import proxy.handler.HandshakeHandler; import proxy.handler.ProxyHandler; import proxy.handler.Handler.ThreadQuickExitException; import proxy.network.Connection; +import proxy.packet.S38PacketPlayerListItem; +import proxy.packet.S38PacketPlayerListItem.Action; import proxy.packet.S40PacketDisconnect; import proxy.packet.ServerInfo; import proxy.util.Formatter; @@ -106,8 +109,12 @@ public class Proxy { private int minPassLength = 8; private int maxAttempts = 5; private int maxPlayers = 64; + private int pingInterval = 5; + private String defaultSkinTexture = "ewogICJ0aW1lc3RhbXAiIDogMTc0OTEyOTgyODQ2MCwKICAicHJvZmlsZUlkIiA6ICJlYjcxMWNlYmNjMWM0ZGQwYTc5MmE3ZGM2Y2Q3NzcyZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJTZW5qaXVuIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzk5ZGMxYmU3ODQ1N2ViODk3Zjk3MTYxYzZjYTEyOTFlMjkxN2IzYzI4ZWIzMTc4OGY3MGEzYWY4ZGIwMGEyN2IiCiAgICB9CiAgfQp9"; + private String defaultSkinSignature = "uX4TdWeMU7nQZp4ZZY5d4GUOg3e+KzgndM3UhcQHZuxpfJqg5l9vZ6KmHpYpUf5hZqEzTLxWefhxLpurm3nd2kzL51GVHMQuquiISqXXGBY33bfCJtl0iVijKhAuvVWrwvBZo5tI/zCz3OQBEdW+DkNAfX7ZXntrl+0JWqhxg2+suzL4pnW7ye45/p4rVhiZ4pU/n0jTF8q6Jv6Rx4L8AoemsQ4MWmC/J5rT24gUD6DuuAc06KjUJy9g1gHNwVJ5uUjzaJ/li6as22Io09B0MdyVe5ryO9WbRKriUComNDWp/YdQrpp/hZThSNTAeJphAS5+YslRod/ZJPknrgx1yLauYaYDoHaVfQx9ZZGvJFOO+tIPQGBIefO1W3QgBqz+hdgFwsevtcqsewcdT/1khAAA2nESahOX5OuVZZhphmbfcUXK4FPn2H4jqcquP5VcsEpq3+IgE/+Nt8qFi4uANB6of/bPDWP/oDzISvtFVj/Odh+kZ/Y+OEYxn9ALYiVz5QF5gww2mtwiOh5/P9kJNc88ZrLgtnf/PggLDr6rET6L2t9DN2biwbm8NlMEB0oMa3wF/E166HRgXsxvTGvYxod1L4c70uaiyU/FlA0fL+K03bxIKYRuH7yht2E2MnzxeuPDIU/26DUG56Ek00eYdHVk9NuyUEX/96uMCArjpZ0="; private ServerInfo status; + private long lastPingSync; private static String getIcon(File file) { if(file.isFile()) { @@ -135,6 +142,7 @@ public class Proxy { public static void main(String[] args) { Thread.currentThread().setName("Proxy thread"); + Log.info("Starting login proxy ..."); Proxy proxy = new Proxy(); proxy.run(); } @@ -145,7 +153,7 @@ public class Proxy { this.registerCommands(); } - public void run() { + private void loadConfig() { this.status = new ServerInfo("VLoginProxy 1.8.9", 47); this.status.setCapacity(this.maxPlayers); Collections.addAll(this.status.getMotds(), Formatter.DARK_RED + "Miau\n" + Formatter.YELLOW + "Test??", Formatter.AQUA + "Server\n" + Formatter.GREEN + "Test!!"); @@ -156,7 +164,11 @@ public class Proxy { if(icon != null) this.status.getIcons().add(icon); Collections.addAll(this.status.getList(), Formatter.DARK_GREEN + "TESTTTT", "Test 2!", Formatter.BLUE + "Test numbah 3!!!!!"); - Log.info("Starting login proxy on %s:%d", this.proxyHost.isEmpty() ? "0.0.0.0" : this.proxyHost, this.proxyPort); + } + + public void run() { + this.loadConfig(); + Log.info("Hosting proxy on %s:%d", this.proxyHost.isEmpty() ? "0.0.0.0" : this.proxyHost, this.proxyPort); try { this.addLanEndpoint(this.proxyHost.isEmpty() ? null : InetAddress.getByName(IDN.toASCII(this.proxyHost)), this.proxyPort); } @@ -214,7 +226,7 @@ public class Proxy { } } } - this.networkTick(); + this.update(); try { Thread.sleep(50L); } @@ -278,7 +290,13 @@ public class Proxy { } } - public void networkTick() { + public void update() { + long time = System.currentTimeMillis(); + if(time - this.lastPingSync >= (long)this.pingInterval * 1000L) { + this.lastPingSync = time; + this.sendPacket(new S38PacketPlayerListItem(this.players.values(), true)); + } + synchronized(this.networkManagers) { Iterator iterator = this.networkManagers.iterator(); @@ -384,6 +402,14 @@ public class Proxy { public int getOnlinePlayers() { return this.players.size(); } + + public String getDefaultSkinTexture() { + return this.defaultSkinTexture; + } + + public String getDefaultSkinSignature() { + return this.defaultSkinSignature; + } public User getUser(String user) { return this.users.get(user.toLowerCase(Locale.US)); @@ -393,11 +419,36 @@ public class Proxy { this.users.put(usr.getUsername().toLowerCase(Locale.US), usr); } + public void sendPacket(Packet packet) { + for(ProxyHandler player : this.players.values()) { + player.sendToClient(packet); + } + } + + public void sendPacket(Packet packet, ProxyHandler except) { + for(ProxyHandler player : this.players.values()) { + if(player != except) + player.sendToClient(packet); + } + } + + private void addPlayer(ProxyHandler handler) { + handler.sendToClient(new S38PacketPlayerListItem(this.players.values(), false)); + this.sendPacket(new S38PacketPlayerListItem(handler, Action.ADD_PLAYER), handler); + this.status.setOnline(this.players.size()); + } + + private void removePlayer(ProxyHandler handler) { + this.sendPacket(new S38PacketPlayerListItem(handler, Action.REMOVE_PLAYER), handler); + this.status.setOnline(this.players.size()); + } + public void deleteUser(String user) { user = user.toLowerCase(Locale.US); this.users.remove(user); - this.players.remove(user); - this.status.setOnline(this.players.size()); + ProxyHandler handler = this.players.remove(user); + if(handler != null) + this.removePlayer(handler); } public void setLoggedIn(String user, ProxyHandler handler) { @@ -407,7 +458,7 @@ public class Proxy { handler.copyFrom(usr); this.users.put(user, handler); this.players.put(user, handler); - this.status.setOnline(this.players.size()); + this.addPlayer(handler); } public void setLoggedOut(String user) { @@ -417,8 +468,8 @@ public class Proxy { User usr = new User(handler.getUsername()); usr.copyFrom(handler); this.users.put(user, usr); + this.removePlayer(handler); } - this.status.setOnline(this.players.size()); } public boolean isLoggedIn(String user) { diff --git a/proxy/src/main/java/proxy/handler/ProxyHandler.java b/proxy/src/main/java/proxy/handler/ProxyHandler.java index 574a908..2d63af0 100755 --- a/proxy/src/main/java/proxy/handler/ProxyHandler.java +++ b/proxy/src/main/java/proxy/handler/ProxyHandler.java @@ -21,6 +21,8 @@ import proxy.network.Packet; import proxy.network.PacketBuffer; import proxy.network.Protocol; import proxy.packet.*; +import proxy.packet.C16PacketClientStatus.EnumState; +import proxy.packet.S38PacketPlayerListItem.Action; import proxy.util.Formatter; import proxy.util.User; import proxy.util.Log; @@ -65,6 +67,8 @@ public class ProxyHandler extends User implements Handler { private Connection server; + private int ping; + private int pingKey; private int networkTickCount; private long lastPingTime; private long lastSentPingPacket; @@ -77,6 +81,8 @@ public class ProxyHandler extends User implements Handler { private String completion; private int spoofedId = -1; private int realId = -1; + private int prevMode = -1; + private int mode = 0; private static boolean isAllowedChar(char ch) { return ch != 167 && ch >= 32 && ch != 127; @@ -110,6 +116,26 @@ public class ProxyHandler extends User implements Handler { public String getUsername() { return this.username; } + + public int getPing() { + return this.ping; + } + + public int getMode() { + return this.mode; + } + + public String getListDisplayName() { + return null; + } + + public String getTextureData() { + return this.skinTexture == null ? this.proxy.getDefaultSkinTexture() : this.skinTexture; + } + + public String getTextureSignature() { + return this.skinTexture == null ? this.proxy.getDefaultSkinSignature() : this.skinSignature; + } public void setupPlayer(int id) { this.spoofedId = id; @@ -131,19 +157,24 @@ public class ProxyHandler extends User implements Handler { public void update(Connection connection) { if(connection == this.server) return; + ++this.networkTickCount; + if((long)this.networkTickCount - this.lastSentPingPacket > 40L) { + this.lastSentPingPacket = (long)this.networkTickCount; + this.lastPingTime = System.nanoTime() / 1000000L; + this.pingKey = (int)this.lastPingTime; + this.sendToClient(new S00PacketKeepAlive(this.pingKey)); + } if(!this.connected) { - ++this.networkTickCount; - if((long)this.networkTickCount - this.lastSentPingPacket > 40L) { - this.lastSentPingPacket = (long)this.networkTickCount; - this.lastPingTime = System.nanoTime() / 1000000L; - this.sendToClient(new S00PacketKeepAlive((int)this.lastPingTime)); - } if(this.hasMoved) { this.hasMoved = false; this.sendToClient(new S08PacketPlayerPosLook(0.5, 65.0, 0.5, 0.0f, 0.0f)); } } if(this.connecting || this.connected) { + if(this.mode != this.prevMode) { + this.prevMode = this.mode; + this.proxy.sendPacket(new S38PacketPlayerListItem(this, Action.UPDATE_GAME_MODE)); + } if(this.server.isChannelOpen()) { try { this.server.processReceivedPackets(); @@ -221,6 +252,13 @@ public class ProxyHandler extends User implements Handler { }, "Forward connector #" + CONN_COUNTER.incrementAndGet()).start(); } + public void processKeepAlive(C00PacketKeepAlive packetIn) { + if(packetIn.getKey() == this.pingKey) { + int passed = (int)(System.nanoTime() / 1000000L - this.lastPingTime); + this.ping = (this.ping * 3 + passed) / 4; + } + } + public void processInput(C0CPacketInput packetIn) { if(this.connected) this.sendToServer(packetIn); @@ -457,21 +495,11 @@ public class ProxyHandler extends User implements Handler { this.sendToServer(packetIn); } - public void handleResourcePackStatus(C19PacketResourcePackStatus packetIn) { - if(this.connected) - this.sendToServer(packetIn); - } - public void processHeldItemChange(C09PacketHeldItemChange packetIn) { if(this.connected) this.sendToServer(packetIn); } - public void processKeepAlive(C00PacketKeepAlive packetIn) { - if(this.connected) - this.sendToServer(packetIn); - } - public void handleAnimation(C0APacketAnimation packetIn) { if(this.connected) this.sendToServer(packetIn); @@ -647,6 +675,7 @@ public class ProxyHandler extends User implements Handler { public void handleJoinGame(S01PacketJoinGame packetIn) { this.realId = packetIn.getEntityId(); + this.mode = packetIn.getGameType(); this.sendToClient(new S07PacketRespawn(packetIn)); // this.sendToClient(new S2EPacketCloseWindow()); } @@ -656,7 +685,7 @@ public class ProxyHandler extends User implements Handler { } public void handleKeepAlive(S00PacketKeepAlive packetIn) { - this.sendToClient(packetIn); + this.sendToServer(new C00PacketKeepAlive(packetIn.func_149134_c())); } public void handleSpawnObject(S0EPacketSpawnObject packetIn) { @@ -768,6 +797,7 @@ public class ProxyHandler extends User implements Handler { } public void handleRespawn(S07PacketRespawn packetIn) { + this.mode = packetIn.getGameType(); this.sendToClient(packetIn); } @@ -828,6 +858,13 @@ public class ProxyHandler extends User implements Handler { } public void handleChangeGameState(S2BPacketChangeGameState packetIn) { + if(packetIn.getType() == 3) { + this.mode = packetIn.getIntValue(); + } + else if(packetIn.getType() == 4) { + this.sendToServer(new C16PacketClientStatus(EnumState.PERFORM_RESPAWN)); + return; + } this.sendToClient(packetIn); } @@ -847,10 +884,6 @@ public class ProxyHandler extends User implements Handler { this.sendToClient(packetIn.replaceEntityId(this.realId, this.spoofedId)); } - public void handleCombatEvent(S42PacketCombatEvent packetIn) { -// this.sendToClient(packetIn); - } - public void handleServerDifficulty(S41PacketServerDifficulty packetIn) { this.sendToClient(packetIn); } @@ -867,18 +900,10 @@ public class ProxyHandler extends User implements Handler { this.sendToClient(packetIn); } - public void handlePlayerListHeaderFooter(S47PacketPlayerListHeaderFooter packetIn) { - this.sendToClient(packetIn); - } - public void handleRemoveEntityEffect(S1EPacketRemoveEntityEffect packetIn) { this.sendToClient(packetIn.replaceEntityId(this.realId, this.spoofedId)); } - public void handlePlayerListItem(S38PacketPlayerListItem packetIn) { - this.sendToClient(packetIn); - } - public void handlePlayerAbilities(S39PacketPlayerAbilities packetIn) { this.sendToClient(packetIn); } @@ -887,10 +912,6 @@ public class ProxyHandler extends User implements Handler { this.sendToClient(packetIn); } - public void handleResourcePack(S48PacketResourcePackSend packetIn) { - this.sendToClient(packetIn); - } - public void handleEntityNBT(S49PacketUpdateEntityNBT packetIn) { this.sendToClient(packetIn.replaceEntityId(this.realId, this.spoofedId)); } @@ -899,22 +920,6 @@ public class ProxyHandler extends User implements Handler { this.sendToClient(packetIn); } - public void handleScoreboardObjective(S3BPacketScoreboardObjective packetIn) { - this.sendToClient(packetIn); - } - - public void handleUpdateScore(S3CPacketUpdateScore packetIn) { - this.sendToClient(packetIn); - } - - public void handleDisplayScoreboard(S3DPacketDisplayScoreboard packetIn) { - this.sendToClient(packetIn); - } - - public void handleTeams(S3EPacketTeams packetIn) { - this.sendToClient(packetIn); - } - public void handleParticles(S2APacketParticles packetIn) { this.sendToClient(packetIn); } diff --git a/proxy/src/main/java/proxy/packet/C16PacketClientStatus.java b/proxy/src/main/java/proxy/packet/C16PacketClientStatus.java index a89a8c9..ab2d62e 100755 --- a/proxy/src/main/java/proxy/packet/C16PacketClientStatus.java +++ b/proxy/src/main/java/proxy/packet/C16PacketClientStatus.java @@ -9,6 +9,13 @@ import proxy.network.PacketBuffer; public class C16PacketClientStatus implements Packet { private C16PacketClientStatus.EnumState status; + + public C16PacketClientStatus() { + } + + public C16PacketClientStatus(EnumState status) { + this.status = status; + } /** * Reads the raw packet data from the data stream. diff --git a/proxy/src/main/java/proxy/packet/C19PacketResourcePackStatus.java b/proxy/src/main/java/proxy/packet/C19PacketResourcePackStatus.java index 20faf6e..500c68a 100755 --- a/proxy/src/main/java/proxy/packet/C19PacketResourcePackStatus.java +++ b/proxy/src/main/java/proxy/packet/C19PacketResourcePackStatus.java @@ -6,42 +6,24 @@ import proxy.handler.ProxyHandler; import proxy.network.Packet; import proxy.network.PacketBuffer; -public class C19PacketResourcePackStatus implements Packet -{ - private String hash; - private C19PacketResourcePackStatus.Action status; +public class C19PacketResourcePackStatus implements Packet { + private static enum Action { + SUCCESSFULLY_LOADED, DECLINED, FAILED_DOWNLOAD, ACCEPTED; + } - /** - * Reads the raw packet data from the data stream. - */ - public void readPacketData(PacketBuffer buf) throws IOException - { - this.hash = buf.readStringFromBuffer(40); - this.status = (C19PacketResourcePackStatus.Action)buf.readEnumValue(C19PacketResourcePackStatus.Action.class); - } + private String hash; + private C19PacketResourcePackStatus.Action status; - /** - * Writes the raw packet data to the data stream. - */ - public void writePacketData(PacketBuffer buf) throws IOException - { - buf.writeString(this.hash); - buf.writeEnumValue(this.status); - } + public void readPacketData(PacketBuffer buf) throws IOException { + this.hash = buf.readStringFromBuffer(40); + this.status = buf.readEnumValue(Action.class); + } - /** - * Passes this Packet on to the NetHandler for processing. - */ - public void processPacket(ProxyHandler handler) - { - handler.handleResourcePackStatus(this); - } + public void writePacketData(PacketBuffer buf) throws IOException { + buf.writeString(this.hash); + buf.writeEnumValue(this.status); + } - public static enum Action - { - SUCCESSFULLY_LOADED, - DECLINED, - FAILED_DOWNLOAD, - ACCEPTED; - } + public void processPacket(ProxyHandler handler) { + } } diff --git a/proxy/src/main/java/proxy/packet/Profile.java b/proxy/src/main/java/proxy/packet/Profile.java deleted file mode 100644 index 18b2587..0000000 --- a/proxy/src/main/java/proxy/packet/Profile.java +++ /dev/null @@ -1,58 +0,0 @@ -package proxy.packet; - -import java.util.UUID; - -import com.google.common.collect.LinkedHashMultimap; -import com.google.common.collect.Multimap; - -public class Profile { - public static class Property { - private final String name; - private final String value; - private final String signature; - - public Property(String value, String name) { - this(value, name, null); - } - - public Property(String name, String value, String signature) { - this.name = name; - this.value = value; - this.signature = signature; - } - - public String getName() { - return this.name; - } - - public String getValue() { - return this.value; - } - - public String getSignature() { - return this.signature; - } - } - - private final UUID id; - private final String name; - private final Multimap properties = LinkedHashMultimap.create(); - private boolean legacy; - - public Profile(UUID id, String name) { - this.id = id; - this.name = name; - } - - public UUID getId() { - return this.id; - } - - public String getName() { - return this.name; - } - - public Multimap getProperties() { - return this.properties; - } -} diff --git a/proxy/src/main/java/proxy/packet/S07PacketRespawn.java b/proxy/src/main/java/proxy/packet/S07PacketRespawn.java index 554dc61..8d9f95e 100755 --- a/proxy/src/main/java/proxy/packet/S07PacketRespawn.java +++ b/proxy/src/main/java/proxy/packet/S07PacketRespawn.java @@ -54,4 +54,9 @@ public class S07PacketRespawn implements Packet buf.writeByte(this.gameType); buf.writeString(this.worldType); } + + public byte getGameType() + { + return this.gameType; + } } diff --git a/proxy/src/main/java/proxy/packet/S2BPacketChangeGameState.java b/proxy/src/main/java/proxy/packet/S2BPacketChangeGameState.java index 451b5de..c14cc6a 100755 --- a/proxy/src/main/java/proxy/packet/S2BPacketChangeGameState.java +++ b/proxy/src/main/java/proxy/packet/S2BPacketChangeGameState.java @@ -9,7 +9,7 @@ import proxy.network.PacketBuffer; public class S2BPacketChangeGameState implements Packet { private int state; - private float field_149141_c; + private float value; public S2BPacketChangeGameState() { @@ -18,7 +18,7 @@ public class S2BPacketChangeGameState implements Packet public S2BPacketChangeGameState(int stateIn, float p_i45194_2_) { this.state = stateIn; - this.field_149141_c = p_i45194_2_; + this.value = p_i45194_2_; } /** @@ -27,7 +27,7 @@ public class S2BPacketChangeGameState implements Packet public void readPacketData(PacketBuffer buf) throws IOException { this.state = buf.readUnsignedByte(); - this.field_149141_c = buf.readFloat(); + this.value = buf.readFloat(); } /** @@ -36,7 +36,7 @@ public class S2BPacketChangeGameState implements Packet public void writePacketData(PacketBuffer buf) throws IOException { buf.writeByte(this.state); - buf.writeFloat(this.field_149141_c); + buf.writeFloat(this.value); } /** @@ -46,4 +46,18 @@ public class S2BPacketChangeGameState implements Packet { handler.handleChangeGameState(this); } + + public int getType() { + return this.state; + } + + public int getIntValue() { + float value = this.value + 0.5f; + int v = (int)value; + return value < (float)v ? v - 1 : v; + } + + public float getFloatValue() { + return this.value; + } } diff --git a/proxy/src/main/java/proxy/packet/S38PacketPlayerListItem.java b/proxy/src/main/java/proxy/packet/S38PacketPlayerListItem.java index 6a3611c..6160606 100755 --- a/proxy/src/main/java/proxy/packet/S38PacketPlayerListItem.java +++ b/proxy/src/main/java/proxy/packet/S38PacketPlayerListItem.java @@ -1,240 +1,198 @@ package proxy.packet; -import com.google.common.base.Objects; import com.google.common.collect.Lists; import java.io.IOException; +import java.util.Collection; import java.util.List; +import java.util.UUID; -import proxy.packet.Profile.Property; +import proxy.Proxy; import proxy.handler.ProxyHandler; import proxy.network.Packet; import proxy.network.PacketBuffer; -public class S38PacketPlayerListItem implements Packet -{ - private S38PacketPlayerListItem.Action action; - private final List players = Lists.newArrayList(); +public class S38PacketPlayerListItem implements Packet { + public static enum Action { + ADD_PLAYER, UPDATE_GAME_MODE, UPDATE_LATENCY, UPDATE_DISPLAY_NAME, REMOVE_PLAYER; + } - /** - * Reads the raw packet data from the data stream. - */ - public void readPacketData(PacketBuffer buf) throws IOException - { - this.action = (S38PacketPlayerListItem.Action)buf.readEnumValue(S38PacketPlayerListItem.Action.class); - int i = buf.readVarIntFromBuffer(); + private class PlayerInfo { + private final String name; + private final int ping; + private final int mode; + private final String displayName; + private final String textureData; + private final String textureSignature; - for (int j = 0; j < i; ++j) - { - Profile gameprofile = null; - int k = 0; - int worldsettings$gametype = 0; - String ichatcomponent = null; + public PlayerInfo(String name, int ping, int mode, String display, String texture, String signature) { + this.name = name; + this.ping = ping; + this.mode = mode; + this.displayName = display; + this.textureData = texture; + this.textureSignature = signature; + } - switch (this.action) - { - case ADD_PLAYER: - gameprofile = new Profile(buf.readUuid(), buf.readStringFromBuffer(16)); - int l = buf.readVarIntFromBuffer(); - int i1 = 0; + public String getName() { + return this.name; + } - for (; i1 < l; ++i1) - { - String s = buf.readStringFromBuffer(32767); - String s1 = buf.readStringFromBuffer(32767); + public int getPing() { + return this.ping; + } - if (buf.readBoolean()) - { - gameprofile.getProperties().put(s, new Property(s, s1, buf.readStringFromBuffer(32767))); - } - else - { - gameprofile.getProperties().put(s, new Property(s, s1)); - } - } + public int getMode() { + return this.mode; + } - worldsettings$gametype = buf.readVarIntFromBuffer(); - k = buf.readVarIntFromBuffer(); + public String getDisplayName() { + return this.displayName; + } - if (buf.readBoolean()) - { - ichatcomponent = buf.readChatComponent(); - } + public String getTextureData() { + return this.textureData; + } - break; + public String getTextureSignature() { + return this.textureSignature; + } + } - case UPDATE_GAME_MODE: - gameprofile = new Profile(buf.readUuid(), (String)null); - worldsettings$gametype = buf.readVarIntFromBuffer(); - break; + private final List players; - case UPDATE_LATENCY: - gameprofile = new Profile(buf.readUuid(), (String)null); - k = buf.readVarIntFromBuffer(); - break; + private Action action; - case UPDATE_DISPLAY_NAME: - gameprofile = new Profile(buf.readUuid(), (String)null); + public S38PacketPlayerListItem() { + this.players = Lists.newArrayList(); + } - if (buf.readBoolean()) - { - ichatcomponent = buf.readChatComponent(); - } + public S38PacketPlayerListItem(Collection players, boolean pingOnly) { + this.players = Lists.newArrayListWithCapacity(players.size()); + for(ProxyHandler player : players) { + this.players.add(new PlayerInfo(player.getUsername(), player.getPing(), player.getMode(), player.getListDisplayName(), player.getTextureData(), player.getTextureSignature())); + } + this.action = pingOnly ? Action.UPDATE_LATENCY : Action.ADD_PLAYER; + } - break; + public S38PacketPlayerListItem(ProxyHandler player, Action action) { + this.players = Lists.newArrayList(new PlayerInfo(player.getUsername(), player.getPing(), player.getMode(), player.getListDisplayName(), player.getTextureData(), player.getTextureSignature())); + this.action = action; + } - case REMOVE_PLAYER: - gameprofile = new Profile(buf.readUuid(), (String)null); - } + public void readPacketData(PacketBuffer buf) throws IOException { + this.action = buf.readEnumValue(Action.class); + int i = buf.readVarIntFromBuffer(); - this.players.add(new S38PacketPlayerListItem.AddPlayerData(gameprofile, k, worldsettings$gametype, ichatcomponent)); - } - } + for(int j = 0; j < i; ++j) { + switch(this.action) { + case ADD_PLAYER: + buf.readUuid(); + buf.readStringFromBuffer(16); + int l = buf.readVarIntFromBuffer(); - /** - * Writes the raw packet data to the data stream. - */ - public void writePacketData(PacketBuffer buf) throws IOException - { - buf.writeEnumValue(this.action); - buf.writeVarIntToBuffer(this.players.size()); + for(int i1 = 0; i1 < l; ++i1) { + String s = buf.readStringFromBuffer(32767); + String s1 = buf.readStringFromBuffer(32767); + if(buf.readBoolean()) + buf.readStringFromBuffer(32767); + } - for (S38PacketPlayerListItem.AddPlayerData s38packetplayerlistitem$addplayerdata : this.players) - { - switch (this.action) - { - case ADD_PLAYER: - buf.writeUuid(s38packetplayerlistitem$addplayerdata.getProfile().getId()); - buf.writeString(s38packetplayerlistitem$addplayerdata.getProfile().getName()); - buf.writeVarIntToBuffer(s38packetplayerlistitem$addplayerdata.getProfile().getProperties().size()); + buf.readVarIntFromBuffer(); + buf.readVarIntFromBuffer(); - for (Property property : s38packetplayerlistitem$addplayerdata.getProfile().getProperties().values()) - { - buf.writeString(property.getName()); - buf.writeString(property.getValue()); + if(buf.readBoolean()) + buf.readChatComponent(); - if (property.getSignature() != null) - { - buf.writeBoolean(true); - buf.writeString(property.getSignature()); - } - else - { - buf.writeBoolean(false); - } - } + break; - buf.writeVarIntToBuffer(s38packetplayerlistitem$addplayerdata.getGameMode()); - buf.writeVarIntToBuffer(s38packetplayerlistitem$addplayerdata.getPing()); + case UPDATE_GAME_MODE: + buf.readUuid(); + buf.readVarIntFromBuffer(); + break; - if (s38packetplayerlistitem$addplayerdata.getDisplayName() == null) - { - buf.writeBoolean(false); - } - else - { - buf.writeBoolean(true); - buf.writeChatComponent(s38packetplayerlistitem$addplayerdata.getDisplayName()); - } + case UPDATE_LATENCY: + buf.readUuid(); + buf.readVarIntFromBuffer(); + break; - break; + case UPDATE_DISPLAY_NAME: + buf.readUuid(); - case UPDATE_GAME_MODE: - buf.writeUuid(s38packetplayerlistitem$addplayerdata.getProfile().getId()); - buf.writeVarIntToBuffer(s38packetplayerlistitem$addplayerdata.getGameMode()); - break; + if(buf.readBoolean()) + buf.readChatComponent(); - case UPDATE_LATENCY: - buf.writeUuid(s38packetplayerlistitem$addplayerdata.getProfile().getId()); - buf.writeVarIntToBuffer(s38packetplayerlistitem$addplayerdata.getPing()); - break; + break; - case UPDATE_DISPLAY_NAME: - buf.writeUuid(s38packetplayerlistitem$addplayerdata.getProfile().getId()); + case REMOVE_PLAYER: + buf.readUuid(); + } + } + } - if (s38packetplayerlistitem$addplayerdata.getDisplayName() == null) - { - buf.writeBoolean(false); - } - else - { - buf.writeBoolean(true); - buf.writeChatComponent(s38packetplayerlistitem$addplayerdata.getDisplayName()); - } + public void writePacketData(PacketBuffer buf) throws IOException { + buf.writeEnumValue(this.action); + buf.writeVarIntToBuffer(this.players.size()); - break; + for(PlayerInfo data : this.players) { + UUID id = Proxy.getOfflineUUID(data.getName()); + switch(this.action) { + case ADD_PLAYER: + buf.writeUuid(id); + buf.writeString(data.getName()); + if(data.getTextureData() == null || data.getTextureSignature() == null) { + buf.writeVarIntToBuffer(0); + } + else { + buf.writeVarIntToBuffer(1); + buf.writeString("textures"); + buf.writeString(data.getTextureData()); + buf.writeBoolean(true); + buf.writeString(data.getTextureSignature()); + } - case REMOVE_PLAYER: - buf.writeUuid(s38packetplayerlistitem$addplayerdata.getProfile().getId()); - } - } - } + buf.writeVarIntToBuffer(data.getMode()); + buf.writeVarIntToBuffer(data.getPing()); - /** - * Passes this Packet on to the NetHandler for processing. - */ - public void processPacket(ProxyHandler handler) - { - handler.handlePlayerListItem(this); - } + if(data.getDisplayName() == null) { + buf.writeBoolean(false); + } + else { + buf.writeBoolean(true); + buf.writeChatComponent(data.getDisplayName()); + } - public List getEntries() - { - return this.players; - } + break; - public S38PacketPlayerListItem.Action getAction() - { - return this.action; - } + case UPDATE_GAME_MODE: + buf.writeUuid(id); + buf.writeVarIntToBuffer(data.getMode()); + break; - public String toString() - { - return Objects.toStringHelper(this).add("action", this.action).add("entries", this.players).toString(); - } + case UPDATE_LATENCY: + buf.writeUuid(id); + buf.writeVarIntToBuffer(data.getPing()); + break; - public static enum Action - { - ADD_PLAYER, - UPDATE_GAME_MODE, - UPDATE_LATENCY, - UPDATE_DISPLAY_NAME, - REMOVE_PLAYER; - } + case UPDATE_DISPLAY_NAME: + buf.writeUuid(id); - public class AddPlayerData - { - private final int ping; - private final int gamemode; - private final Profile profile; - private final String displayName; + if(data.getDisplayName() == null) { + buf.writeBoolean(false); + } + else { + buf.writeBoolean(true); + buf.writeChatComponent(data.getDisplayName()); + } - public AddPlayerData(Profile profile, int pingIn, int gamemodeIn, String displayNameIn) - { - this.profile = profile; - this.ping = pingIn; - this.gamemode = gamemodeIn; - this.displayName = displayNameIn; - } + break; - public Profile getProfile() - { - return this.profile; - } + case REMOVE_PLAYER: + buf.writeUuid(id); + } + } + } - public int getPing() - { - return this.ping; - } - - public int getGameMode() - { - return this.gamemode; - } - - public String getDisplayName() - { - return this.displayName; - } - } + public void processPacket(ProxyHandler handler) { + } } diff --git a/proxy/src/main/java/proxy/packet/S3BPacketScoreboardObjective.java b/proxy/src/main/java/proxy/packet/S3BPacketScoreboardObjective.java index 6e70c17..2af80f0 100755 --- a/proxy/src/main/java/proxy/packet/S3BPacketScoreboardObjective.java +++ b/proxy/src/main/java/proxy/packet/S3BPacketScoreboardObjective.java @@ -11,7 +11,17 @@ public class S3BPacketScoreboardObjective implements Packet private String objectiveName; private String objectiveValue; private String type; - private int field_149342_c; + private int mode; + + public S3BPacketScoreboardObjective() { + } + + public S3BPacketScoreboardObjective(String name, String value, String type, int mode) { + this.objectiveName = name; + this.objectiveValue = value; + this.type = type; + this.mode = mode; + } /** * Reads the raw packet data from the data stream. @@ -19,9 +29,9 @@ public class S3BPacketScoreboardObjective implements Packet public void readPacketData(PacketBuffer buf) throws IOException { this.objectiveName = buf.readStringFromBuffer(16); - this.field_149342_c = buf.readByte(); + this.mode = buf.readByte(); - if (this.field_149342_c == 0 || this.field_149342_c == 2) + if (this.mode == 0 || this.mode == 2) { this.objectiveValue = buf.readStringFromBuffer(32); this.type = buf.readStringFromBuffer(16); @@ -34,9 +44,9 @@ public class S3BPacketScoreboardObjective implements Packet public void writePacketData(PacketBuffer buf) throws IOException { buf.writeString(this.objectiveName); - buf.writeByte(this.field_149342_c); + buf.writeByte(this.mode); - if (this.field_149342_c == 0 || this.field_149342_c == 2) + if (this.mode == 0 || this.mode == 2) { buf.writeString(this.objectiveValue); buf.writeString(this.type); @@ -48,6 +58,5 @@ public class S3BPacketScoreboardObjective implements Packet */ public void processPacket(ProxyHandler handler) { - handler.handleScoreboardObjective(this); } } diff --git a/proxy/src/main/java/proxy/packet/S3CPacketUpdateScore.java b/proxy/src/main/java/proxy/packet/S3CPacketUpdateScore.java index c6c6ba0..e99c45f 100755 --- a/proxy/src/main/java/proxy/packet/S3CPacketUpdateScore.java +++ b/proxy/src/main/java/proxy/packet/S3CPacketUpdateScore.java @@ -8,10 +8,26 @@ import proxy.network.PacketBuffer; public class S3CPacketUpdateScore implements Packet { + private static enum Action + { + CHANGE, + REMOVE; + } + private String name = ""; private String objective = ""; private int value; private S3CPacketUpdateScore.Action action; + + public S3CPacketUpdateScore() { + } + + public S3CPacketUpdateScore(String name, String objective, int value, boolean remove) { + this.name = name; + this.objective = objective; + this.value = value; + this.action = remove ? Action.REMOVE : Action.CHANGE; + } /** * Reads the raw packet data from the data stream. @@ -48,12 +64,5 @@ public class S3CPacketUpdateScore implements Packet */ public void processPacket(ProxyHandler handler) { - handler.handleUpdateScore(this); - } - - public static enum Action - { - CHANGE, - REMOVE; } } diff --git a/proxy/src/main/java/proxy/packet/S3DPacketDisplayScoreboard.java b/proxy/src/main/java/proxy/packet/S3DPacketDisplayScoreboard.java index eb5807a..a7385ee 100755 --- a/proxy/src/main/java/proxy/packet/S3DPacketDisplayScoreboard.java +++ b/proxy/src/main/java/proxy/packet/S3DPacketDisplayScoreboard.java @@ -10,6 +10,14 @@ public class S3DPacketDisplayScoreboard implements Packet { private int position; private String scoreName; + + public S3DPacketDisplayScoreboard() { + } + + public S3DPacketDisplayScoreboard(int position, String scoreName) { + this.position = position; + this.scoreName = scoreName; + } /** * Reads the raw packet data from the data stream. @@ -34,6 +42,5 @@ public class S3DPacketDisplayScoreboard implements Packet */ public void processPacket(ProxyHandler handler) { - handler.handleDisplayScoreboard(this); } } diff --git a/proxy/src/main/java/proxy/packet/S3EPacketTeams.java b/proxy/src/main/java/proxy/packet/S3EPacketTeams.java index eb0cf19..01cca93 100755 --- a/proxy/src/main/java/proxy/packet/S3EPacketTeams.java +++ b/proxy/src/main/java/proxy/packet/S3EPacketTeams.java @@ -20,6 +20,18 @@ public class S3EPacketTeams implements Packet private Collection players; private int action; private int friendlyFlags; + + private static String getSortedTeamName(int sort, String player) { + sort ^= 0x80000000; + char[] chars = new char[10]; + for(int z = 0; z < 2; z++) { + chars[z] = (char)((sort >> ((1 - z) * 16)) & 0xffff); + } + for(int z = 0; z < 8; z++) { + chars[z + 2] = (char)((z < player.length() ? player.charAt(z / 2) : 0) << 8 | (z + 1 < player.length() ? player.charAt(z / 2 + 1) : 0)); + } + return new String(chars); + } public S3EPacketTeams() { @@ -27,6 +39,19 @@ public class S3EPacketTeams implements Packet this.color = -1; this.players = Lists.newArrayList(); } + + public S3EPacketTeams(int action, int sort, String prefix, String suffix, String player) + { + this.nameTagVisibility = "always"; + this.color = -1; + this.players = Lists.newArrayList(player); + this.friendlyFlags = 1; + this.action = action; + this.name = getSortedTeamName(sort, player); + this.displayName = ""; + this.prefix = prefix; + this.suffix = suffix; + } /** * Reads the raw packet data from the data stream. @@ -91,6 +116,5 @@ public class S3EPacketTeams implements Packet */ public void processPacket(ProxyHandler handler) { - handler.handleTeams(this); } } diff --git a/proxy/src/main/java/proxy/packet/S42PacketCombatEvent.java b/proxy/src/main/java/proxy/packet/S42PacketCombatEvent.java index f0d087a..170e461 100755 --- a/proxy/src/main/java/proxy/packet/S42PacketCombatEvent.java +++ b/proxy/src/main/java/proxy/packet/S42PacketCombatEvent.java @@ -6,66 +6,43 @@ import proxy.handler.ProxyHandler; import proxy.network.Packet; import proxy.network.PacketBuffer; -public class S42PacketCombatEvent implements Packet -{ - public S42PacketCombatEvent.Event eventType; - public int field_179774_b; - public int field_179775_c; - public int field_179772_d; - public String deathMessage; +public class S42PacketCombatEvent implements Packet { + private static enum Event { + TYPE1, TYPE2, TYPE3; + } - /** - * Reads the raw packet data from the data stream. - */ - public void readPacketData(PacketBuffer buf) throws IOException - { - this.eventType = (S42PacketCombatEvent.Event)buf.readEnumValue(S42PacketCombatEvent.Event.class); + public Event ignored0; + public int ignored1; + public int ignored2; + public int ignored3; + public String ignored4; - if (this.eventType == S42PacketCombatEvent.Event.END_COMBAT) - { - this.field_179772_d = buf.readVarIntFromBuffer(); - this.field_179775_c = buf.readInt(); - } - else if (this.eventType == S42PacketCombatEvent.Event.ENTITY_DIED) - { - this.field_179774_b = buf.readVarIntFromBuffer(); - this.field_179775_c = buf.readInt(); - this.deathMessage = buf.readStringFromBuffer(32767); - } - } + public void readPacketData(PacketBuffer buf) throws IOException { + this.ignored0 = buf.readEnumValue(Event.class); + if(this.ignored0 == Event.TYPE2) { + this.ignored3 = buf.readVarIntFromBuffer(); + this.ignored2 = buf.readInt(); + } + else if(this.ignored0 == Event.TYPE3) { + this.ignored1 = buf.readVarIntFromBuffer(); + this.ignored2 = buf.readInt(); + this.ignored4 = buf.readStringFromBuffer(32767); + } + } - /** - * Writes the raw packet data to the data stream. - */ - public void writePacketData(PacketBuffer buf) throws IOException - { - buf.writeEnumValue(this.eventType); + public void writePacketData(PacketBuffer buf) throws IOException { + buf.writeEnumValue(this.ignored0); + if(this.ignored0 == Event.TYPE2) { + buf.writeVarIntToBuffer(this.ignored3); + buf.writeInt(this.ignored2); + } + else if(this.ignored0 == Event.TYPE3) { + buf.writeVarIntToBuffer(this.ignored1); + buf.writeInt(this.ignored2); + buf.writeString(this.ignored4); + } + } - if (this.eventType == S42PacketCombatEvent.Event.END_COMBAT) - { - buf.writeVarIntToBuffer(this.field_179772_d); - buf.writeInt(this.field_179775_c); - } - else if (this.eventType == S42PacketCombatEvent.Event.ENTITY_DIED) - { - buf.writeVarIntToBuffer(this.field_179774_b); - buf.writeInt(this.field_179775_c); - buf.writeString(this.deathMessage); - } - } - - /** - * Passes this Packet on to the NetHandler for processing. - */ - public void processPacket(ProxyHandler handler) - { - handler.handleCombatEvent(this); - } - - public static enum Event - { - ENTER_COMBAT, - END_COMBAT, - ENTITY_DIED; - } + public void processPacket(ProxyHandler handler) { + } } diff --git a/proxy/src/main/java/proxy/packet/S47PacketPlayerListHeaderFooter.java b/proxy/src/main/java/proxy/packet/S47PacketPlayerListHeaderFooter.java index 130a296..323f777 100755 --- a/proxy/src/main/java/proxy/packet/S47PacketPlayerListHeaderFooter.java +++ b/proxy/src/main/java/proxy/packet/S47PacketPlayerListHeaderFooter.java @@ -10,6 +10,14 @@ public class S47PacketPlayerListHeaderFooter implements Packet { private String header; private String footer; + + public S47PacketPlayerListHeaderFooter() { + } + + public S47PacketPlayerListHeaderFooter(String header, String footer) { + this.header = header; + this.footer = footer; + } /** * Reads the raw packet data from the data stream. @@ -34,6 +42,5 @@ public class S47PacketPlayerListHeaderFooter implements Packet */ public void processPacket(ProxyHandler handler) { - handler.handlePlayerListHeaderFooter(this); } } diff --git a/proxy/src/main/java/proxy/packet/S48PacketResourcePackSend.java b/proxy/src/main/java/proxy/packet/S48PacketResourcePackSend.java index 0e4bd6c..5bdc7cd 100755 --- a/proxy/src/main/java/proxy/packet/S48PacketResourcePackSend.java +++ b/proxy/src/main/java/proxy/packet/S48PacketResourcePackSend.java @@ -10,6 +10,14 @@ public class S48PacketResourcePackSend implements Packet { private String url; private String hash; + + public S48PacketResourcePackSend() { + } + + public S48PacketResourcePackSend(String url, String hash) { + this.url = url; + this.hash = hash; + } /** * Reads the raw packet data from the data stream. @@ -34,6 +42,5 @@ public class S48PacketResourcePackSend implements Packet */ public void processPacket(ProxyHandler handler) { - handler.handleResourcePack(this); } } diff --git a/proxy/src/main/java/proxy/util/User.java b/proxy/src/main/java/proxy/util/User.java index 2a82b26..1cfaf85 100644 --- a/proxy/src/main/java/proxy/util/User.java +++ b/proxy/src/main/java/proxy/util/User.java @@ -13,6 +13,8 @@ public class User { private byte[] hash; private byte[] salt; protected boolean admin; + protected String skinTexture; + protected String skinSignature; public User(String username) { this.username = username;