From a9b113a4369f9d858ae63cb8a1472a5c7b9612b3 Mon Sep 17 00:00:00 2001 From: Sen Date: Thu, 5 Jun 2025 16:18:09 +0200 Subject: [PATCH] various fixes and improvements --- proxy/src/main/java/proxy/Proxy.java | 2 + .../main/java/proxy/command/CommandList.java | 23 +++++++++ .../main/java/proxy/command/CommandPing.java | 33 ++++++++++++ .../main/java/proxy/handler/ProxyHandler.java | 14 +++--- .../proxy/packet/C15PacketClientSettings.java | 50 +++++++++---------- .../main/java/proxy/packet/S02PacketChat.java | 4 +- 6 files changed, 92 insertions(+), 34 deletions(-) create mode 100644 proxy/src/main/java/proxy/command/CommandList.java create mode 100644 proxy/src/main/java/proxy/command/CommandPing.java diff --git a/proxy/src/main/java/proxy/Proxy.java b/proxy/src/main/java/proxy/Proxy.java index d3c4722..17d445b 100755 --- a/proxy/src/main/java/proxy/Proxy.java +++ b/proxy/src/main/java/proxy/Proxy.java @@ -493,6 +493,8 @@ public class Proxy { this.register(new CommandRevoke()); this.register(new CommandRegister()); this.register(new CommandDelete()); + this.register(new CommandList()); + this.register(new CommandPing()); } public Map getCommands() { diff --git a/proxy/src/main/java/proxy/command/CommandList.java b/proxy/src/main/java/proxy/command/CommandList.java new file mode 100644 index 0000000..54bf4b1 --- /dev/null +++ b/proxy/src/main/java/proxy/command/CommandList.java @@ -0,0 +1,23 @@ +package proxy.command; + +import proxy.Proxy; +import proxy.handler.ProxyHandler; +import proxy.util.Formatter; + +public class CommandList extends Command { + public String getName() { + return "list"; + } + + public String getHelp() { + return "Displays a list of online players"; + } + + public void run(Proxy proxy, ProxyHandler player, String[] args) { + int cnt = proxy.getPlayers().size(); + for(ProxyHandler plr : proxy.getPlayers()) { + sendMessage(player, (plr.isAdmin() ? Formatter.GOLD : Formatter.GREEN) + plr.getUsername()); + } + sendMessage(player, (cnt == 0 ? Formatter.GRAY + "No players are" : Formatter.DARK_GREEN + (cnt == 1 ? "1 player is" : "%d players are")) + " online", cnt); + } +} diff --git a/proxy/src/main/java/proxy/command/CommandPing.java b/proxy/src/main/java/proxy/command/CommandPing.java new file mode 100644 index 0000000..06c8280 --- /dev/null +++ b/proxy/src/main/java/proxy/command/CommandPing.java @@ -0,0 +1,33 @@ +package proxy.command; + +import proxy.Proxy; +import proxy.handler.ProxyHandler; + +public class CommandPing extends Command { + public String getName() { + return "ping"; + } + + public String getHelp() { + return "Display a players latency"; + } + + public String getArgs() { + return ""; + } + + public void run(Proxy proxy, ProxyHandler player, String[] args) { + if(player == null && args.length < 1) + throw new RunException("Please provide a player name"); + ProxyHandler plr = args.length < 1 ? player : proxy.getPlayer(args[0]); + if(plr == null) + throw new RunException("'%s' is not online", args[0]); + if(player != null && plr != player && !player.isAdmin()) + throw new RunException("You are not allowed to query the latency of another player"); + sendInfo(player, (plr == player ? "Your latency" : "Latency of %s") + ": %d ms", plr == player ? plr.getPing() : plr.getUsername(), plr.getPing()); + } + + public Iterable complete(Proxy proxy, ProxyHandler player, String[] args) { + return args.length == 1 && (player == null || player.isAdmin()) ? proxy.getPlayerNames() : null; + } +} diff --git a/proxy/src/main/java/proxy/handler/ProxyHandler.java b/proxy/src/main/java/proxy/handler/ProxyHandler.java index 2d63af0..28de1c2 100755 --- a/proxy/src/main/java/proxy/handler/ProxyHandler.java +++ b/proxy/src/main/java/proxy/handler/ProxyHandler.java @@ -83,6 +83,7 @@ public class ProxyHandler extends User implements Handler { private int realId = -1; private int prevMode = -1; private int mode = 0; + private byte modelFlags = 0x7f; private static boolean isAllowedChar(char ch) { return ch != 167 && ch >= 32 && ch != 127; @@ -147,11 +148,11 @@ public class ProxyHandler extends User implements Handler { } public void sendMessage(String message) { - this.sendToClient(new S02PacketChat(message, (byte)0)); + this.sendToClient(new S02PacketChat(message, false)); } public void sendMessage(String fmt, Object... args) { - this.sendToClient(new S02PacketChat(String.format(fmt, args), (byte)0)); + this.sendToClient(new S02PacketChat(String.format(fmt, args), false)); } public void update(Connection connection) { @@ -423,9 +424,7 @@ public class ProxyHandler extends User implements Handler { } else { msg = String.format(Formatter.BLUE + "%s" + Formatter.DARK_GRAY + ": " + Formatter.GRAY + "%s", this.username, packetIn.getMessage()); - for(ProxyHandler player : this.proxy.getPlayers()) { - player.sendToClient(new S02PacketChat(msg, (byte)1)); - } + this.proxy.sendPacket(new S02PacketChat(msg, false)); Log.info(Formatter.strip(msg)); } } @@ -450,7 +449,8 @@ public class ProxyHandler extends User implements Handler { if(this.completion.indexOf(' ') == -1) { list = this.completion.indexOf(':') != -1 ? Lists.newArrayList() : Lists.newArrayList(packetIn.getMatches()); for(Iterator iter = list.iterator(); iter.hasNext();) { - if(iter.next().indexOf(':') != -1) + String cmd = iter.next(); + if(cmd.isEmpty() || cmd.indexOf(':') != -1 || this.proxy.getCommands().containsKey(cmd.substring(1).toLowerCase(Locale.US))) iter.remove(); } if(this.admin) { @@ -548,6 +548,7 @@ public class ProxyHandler extends User implements Handler { public void processClientSettings(C15PacketClientSettings packetIn) { if(this.connected) this.sendToServer(packetIn); + this.modelFlags = packetIn.getModelFlags(); } public void processCreativeInventoryAction(C10PacketCreativeInventoryAction packetIn) { @@ -678,6 +679,7 @@ public class ProxyHandler extends User implements Handler { this.mode = packetIn.getGameType(); this.sendToClient(new S07PacketRespawn(packetIn)); // this.sendToClient(new S2EPacketCloseWindow()); + this.sendToServer(new C15PacketClientSettings(this.modelFlags)); } public void handleSetCompressionLevel(S46PacketSetCompressionLevel packetIn) { diff --git a/proxy/src/main/java/proxy/packet/C15PacketClientSettings.java b/proxy/src/main/java/proxy/packet/C15PacketClientSettings.java index 92182ce..3cf5de0 100755 --- a/proxy/src/main/java/proxy/packet/C15PacketClientSettings.java +++ b/proxy/src/main/java/proxy/packet/C15PacketClientSettings.java @@ -8,41 +8,39 @@ import proxy.network.PacketBuffer; public class C15PacketClientSettings implements Packet { - private String lang; - private int view; - private byte chatVisibility; - private boolean enableColors; - private int modelPartFlags; - - /** - * Reads the raw packet data from the data stream. - */ - public void readPacketData(PacketBuffer buf) throws IOException - { - this.lang = buf.readStringFromBuffer(7); - this.view = buf.readByte(); - this.chatVisibility = buf.readByte(); - this.enableColors = buf.readBoolean(); - this.modelPartFlags = buf.readUnsignedByte(); + private byte modelPartFlags; + + public C15PacketClientSettings() { + } + + public C15PacketClientSettings(byte modelFlags) { + this.modelPartFlags = modelFlags; + } + + public void readPacketData(PacketBuffer buf) throws IOException + { + buf.readStringFromBuffer(7); + buf.readByte(); + buf.readByte(); + buf.readBoolean(); + this.modelPartFlags = (byte)buf.readUnsignedByte(); } - /** - * Writes the raw packet data to the data stream. - */ public void writePacketData(PacketBuffer buf) throws IOException { - buf.writeString(this.lang); - buf.writeByte(this.view); - buf.writeByte(this.chatVisibility); - buf.writeBoolean(this.enableColors); + buf.writeString("en_US"); + buf.writeByte(16); + buf.writeByte(0); + buf.writeBoolean(true); buf.writeByte(this.modelPartFlags); } - /** - * Passes this Packet on to the NetHandler for processing. - */ public void processPacket(ProxyHandler handler) { handler.processClientSettings(this); } + + public byte getModelFlags() { + return this.modelPartFlags; + } } diff --git a/proxy/src/main/java/proxy/packet/S02PacketChat.java b/proxy/src/main/java/proxy/packet/S02PacketChat.java index 49ab3e9..5e48db3 100755 --- a/proxy/src/main/java/proxy/packet/S02PacketChat.java +++ b/proxy/src/main/java/proxy/packet/S02PacketChat.java @@ -16,10 +16,10 @@ public class S02PacketChat implements Packet { } - public S02PacketChat(String message, byte type) + public S02PacketChat(String message, boolean hotbar) { this.chatComponent = Formatter.toJsonString(message); - this.type = type; + this.type = (byte)(hotbar ? 2 : 0); } /**