diff --git a/build.gradle b/build.gradle index 64b656b..261178d 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group 'ru.nanit' -version '1.2' +version '1.2.1' repositories { mavenCentral() diff --git a/src/main/java/ru/nanit/limbo/connection/ClientConnection.java b/src/main/java/ru/nanit/limbo/connection/ClientConnection.java index ed50803..898f0a7 100644 --- a/src/main/java/ru/nanit/limbo/connection/ClientConnection.java +++ b/src/main/java/ru/nanit/limbo/connection/ClientConnection.java @@ -28,6 +28,7 @@ import java.net.InetSocketAddress; import java.net.SocketAddress; import java.security.InvalidKeyException; import java.security.MessageDigest; +import java.util.Collections; import java.util.UUID; import java.util.concurrent.ThreadLocalRandom; @@ -37,6 +38,7 @@ public class ClientConnection extends ChannelInboundHandlerAdapter { private static PreRenderedPacket PACKET_JOIN_GAME; private static PreRenderedPacket PACKET_PLAYER_ABILITIES; private static PreRenderedPacket PACKET_PLAYER_INFO; + private static PreRenderedPacket PACKET_DECLARE_COMMANDS; private static PreRenderedPacket PACKET_PLAYER_POS; private static PreRenderedPacket PACKET_JOIN_MESSAGE; private static PreRenderedPacket PACKET_BOSS_BAR; @@ -191,6 +193,7 @@ public class ClientConnection extends ChannelInboundHandlerAdapter { writePacket(PACKET_PLAYER_ABILITIES); writePacket(PACKET_PLAYER_POS); writePacket(PACKET_PLAYER_INFO); + writePacket(PACKET_DECLARE_COMMANDS); if (PACKET_BOSS_BAR != null) writePacket(PACKET_BOSS_BAR); @@ -312,11 +315,15 @@ public class ClientConnection extends ChannelInboundHandlerAdapter { info.setGameMode(server.getConfig().getGameMode()); info.setUuid(uuid); + PacketDeclareCommands declareCommands = new PacketDeclareCommands(); + declareCommands.setCommands(Collections.singletonList("limbo")); + PACKET_LOGIN_SUCCESS = PreRenderedPacket.of(loginSuccess); PACKET_JOIN_GAME = PreRenderedPacket.of(joinGame); PACKET_PLAYER_ABILITIES = PreRenderedPacket.of(playerAbilities); PACKET_PLAYER_POS = PreRenderedPacket.of(positionAndLook); PACKET_PLAYER_INFO = PreRenderedPacket.of(info); + PACKET_DECLARE_COMMANDS = PreRenderedPacket.of(declareCommands); if (server.getConfig().isUseJoinMessage()){ PacketChatMessage joinMessage = new PacketChatMessage(); diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketDeclareCommands.java b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketDeclareCommands.java new file mode 100644 index 0000000..24926cb --- /dev/null +++ b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketDeclareCommands.java @@ -0,0 +1,52 @@ +package ru.nanit.limbo.protocol.packets.play; + +import ru.nanit.limbo.protocol.ByteMessage; +import ru.nanit.limbo.protocol.PacketOut; + +import java.util.List; + +public class PacketDeclareCommands implements PacketOut { + + private List commands; + + public void setCommands(List commands) { + this.commands = commands; + } + + @Override + public void encode(ByteMessage msg) { + msg.writeVarInt(commands.size() * 2 + 1); // +1 because declaring root node + + // Declare root node + + msg.writeByte(0); + msg.writeVarInt(commands.size()); + + for (int i = 1; i <= commands.size() * 2; i++){ + msg.writeVarInt(i++); + } + + // Declare other commands + + int i = 1; + for (String cmd : commands){ + msg.writeByte(1 | 0x04); + msg.writeVarInt(1); + msg.writeVarInt(i + 1); + msg.writeString(cmd); + i++; + + msg.writeByte(2 | 0x04 | 0x10); + msg.writeVarInt(1); + msg.writeVarInt(i); + msg.writeString("arg"); + msg.writeString("brigadier:string"); + msg.writeVarInt(0); + msg.writeString("minecraft:ask_server"); + i++; + } + + msg.writeVarInt(0); + } + +} diff --git a/src/main/java/ru/nanit/limbo/protocol/registry/State.java b/src/main/java/ru/nanit/limbo/protocol/registry/State.java index 3e6d81b..fcc6e39 100644 --- a/src/main/java/ru/nanit/limbo/protocol/registry/State.java +++ b/src/main/java/ru/nanit/limbo/protocol/registry/State.java @@ -39,6 +39,7 @@ public enum State { PLAY(3){ { serverBound.register(0x10, PacketKeepAlive::new); + clientBound.register(0x10, PacketDeclareCommands::new); clientBound.register(0x24, PacketJoinGame::new); clientBound.register(0x30, PacketPlayerAbilities::new); clientBound.register(0x34, PacketPlayerPositionAndLook::new);