From d6d1220778b6343d749f6fd41d4144ff39b1cf24 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Sun, 9 Jan 2022 20:26:10 +0100 Subject: [PATCH] network: advancements --- .../Advancement.kt} | 19 ++- .../advancements/AdvancementDisplay.kt | 27 ++++ .../AdvancementFrames.kt} | 27 ++-- .../advancements/AdvancementProgress.kt | 19 +++ .../data/player/advancements/Advancement.java | 46 ------- .../advancements/AdvancementDisplay.java | 103 -------------- .../network/connection/play/PlayConnection.kt | 2 +- ...nThresholdChange.kt => CompressionS2CP.kt} | 2 +- .../packets/s2c/login/CompressionS2CP.kt | 4 +- .../protocol/packets/s2c/play/CommandsS2CP.kt | 73 ++++++++++ .../packets/s2c/play/CompressionS2CP.kt | 4 +- .../packets/s2c/play/PacketAdvancements.java | 129 ------------------ .../s2c/play/PacketDeclareCommands.java | 51 ------- .../s2c/play/PacketSelectAdvancementTab.java | 79 ----------- .../play/advancement/AdvancementTabS2CP.kt | 31 +++++ .../s2c/play/advancement/AdvancementsS2CP.kt | 94 +++++++++++++ .../protocol/protocol/InByteBuffer.kt | 52 ++----- .../protocol/protocol/PlayInByteBuffer.kt | 8 ++ .../commands/commands/CommandSendChat.java | 6 +- .../assets/minosoft/mapping/versions.json | 22 +-- 20 files changed, 302 insertions(+), 496 deletions(-) rename src/main/java/de/bixilon/minosoft/{data/player/advancements/AdvancementProgress.java => advancements/Advancement.kt} (68%) create mode 100644 src/main/java/de/bixilon/minosoft/advancements/AdvancementDisplay.kt rename src/main/java/de/bixilon/minosoft/{data/player/advancements/CriterionProgress.java => advancements/AdvancementFrames.kt} (60%) create mode 100644 src/main/java/de/bixilon/minosoft/advancements/AdvancementProgress.kt delete mode 100644 src/main/java/de/bixilon/minosoft/data/player/advancements/Advancement.java delete mode 100644 src/main/java/de/bixilon/minosoft/data/player/advancements/AdvancementDisplay.java rename src/main/java/de/bixilon/minosoft/protocol/packets/s2c/interfaces/{CompressionThresholdChange.kt => CompressionS2CP.kt} (95%) create mode 100644 src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/CommandsS2CP.kt delete mode 100644 src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketAdvancements.java delete mode 100644 src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketDeclareCommands.java delete mode 100644 src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketSelectAdvancementTab.java create mode 100644 src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/advancement/AdvancementTabS2CP.kt create mode 100644 src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/advancement/AdvancementsS2CP.kt diff --git a/src/main/java/de/bixilon/minosoft/data/player/advancements/AdvancementProgress.java b/src/main/java/de/bixilon/minosoft/advancements/Advancement.kt similarity index 68% rename from src/main/java/de/bixilon/minosoft/data/player/advancements/AdvancementProgress.java rename to src/main/java/de/bixilon/minosoft/advancements/Advancement.kt index 135f598b2..6e7c57b11 100644 --- a/src/main/java/de/bixilon/minosoft/data/player/advancements/AdvancementProgress.java +++ b/src/main/java/de/bixilon/minosoft/advancements/Advancement.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020 Moritz Zwerger + * Copyright (C) 2020-2022 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -11,14 +11,11 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.data.player.advancements; +package de.bixilon.minosoft.advancements -import java.util.HashMap; - -public class AdvancementProgress { - private final HashMap progress; - - public AdvancementProgress(HashMap progress) { - this.progress = progress; - } -} +data class Advancement( + val parent: String?, + val display: AdvancementDisplay?, + val criteria: Set, + val requirements: Set>, +) diff --git a/src/main/java/de/bixilon/minosoft/advancements/AdvancementDisplay.kt b/src/main/java/de/bixilon/minosoft/advancements/AdvancementDisplay.kt new file mode 100644 index 000000000..d346101cd --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/advancements/AdvancementDisplay.kt @@ -0,0 +1,27 @@ +/* + * Minosoft + * Copyright (C) 2020-2022 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.advancements + +import de.bixilon.minosoft.data.inventory.ItemStack +import de.bixilon.minosoft.data.text.ChatComponent +import glm_.vec2.Vec2 + +data class AdvancementDisplay( + val title: ChatComponent, + val description: ChatComponent, + val icon: ItemStack?, + val frame: AdvancementFrames, + val background: String?, + val position: Vec2, +) diff --git a/src/main/java/de/bixilon/minosoft/data/player/advancements/CriterionProgress.java b/src/main/java/de/bixilon/minosoft/advancements/AdvancementFrames.kt similarity index 60% rename from src/main/java/de/bixilon/minosoft/data/player/advancements/CriterionProgress.java rename to src/main/java/de/bixilon/minosoft/advancements/AdvancementFrames.kt index 6980381dd..1cbf03ac8 100644 --- a/src/main/java/de/bixilon/minosoft/data/player/advancements/CriterionProgress.java +++ b/src/main/java/de/bixilon/minosoft/advancements/AdvancementFrames.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020 Moritz Zwerger + * Copyright (C) 2020-2022 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -11,22 +11,19 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.data.player.advancements; +package de.bixilon.minosoft.advancements -public class CriterionProgress { - private final boolean archived; - private final Long archiveTime; +import de.bixilon.kutil.enums.EnumUtil +import de.bixilon.kutil.enums.ValuesEnum - public CriterionProgress(boolean archived, Long archiveTime) { - this.archived = archived; - this.archiveTime = archiveTime; - } +enum class AdvancementFrames { + TASK, + CHALLENGE, + GOAL, + ; - public boolean isArchived() { - return this.archived; - } - - public Long getArchiveTime() { - return this.archiveTime; + companion object : ValuesEnum { + override val VALUES: Array = values() + override val NAME_MAP: Map = EnumUtil.getEnumValues(VALUES) } } diff --git a/src/main/java/de/bixilon/minosoft/advancements/AdvancementProgress.kt b/src/main/java/de/bixilon/minosoft/advancements/AdvancementProgress.kt new file mode 100644 index 000000000..fc2a3c0d8 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/advancements/AdvancementProgress.kt @@ -0,0 +1,19 @@ +/* + * Minosoft + * Copyright (C) 2020-2022 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.advancements + +data class AdvancementProgress( + val criterion: String, + val archiveTime: Long?, +) diff --git a/src/main/java/de/bixilon/minosoft/data/player/advancements/Advancement.java b/src/main/java/de/bixilon/minosoft/data/player/advancements/Advancement.java deleted file mode 100644 index 7b5ac2751..000000000 --- a/src/main/java/de/bixilon/minosoft/data/player/advancements/Advancement.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Minosoft - * Copyright (C) 2020 Moritz Zwerger - * - * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program. If not, see . - * - * This software is not affiliated with Mojang AB, the original developer of Minecraft. - */ - -package de.bixilon.minosoft.data.player.advancements; - -import java.util.ArrayList; - -public class Advancement { - private final String parentName; - private final AdvancementDisplay display; - private final ArrayList criteria; - private final ArrayList requirements; - - public Advancement(String parentName, AdvancementDisplay display, ArrayList criteria, ArrayList requirements) { - this.parentName = parentName; - this.display = display; - this.criteria = criteria; - this.requirements = requirements; - } - - public String getParentName() { - return this.parentName; - } - - public AdvancementDisplay getDisplay() { - return this.display; - } - - public ArrayList getCriteria() { - return this.criteria; - } - - public ArrayList getRequirements() { - return this.requirements; - } -} diff --git a/src/main/java/de/bixilon/minosoft/data/player/advancements/AdvancementDisplay.java b/src/main/java/de/bixilon/minosoft/data/player/advancements/AdvancementDisplay.java deleted file mode 100644 index dc8419ff8..000000000 --- a/src/main/java/de/bixilon/minosoft/data/player/advancements/AdvancementDisplay.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Minosoft - * Copyright (C) 2020 Moritz Zwerger - * - * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program. If not, see . - * - * This software is not affiliated with Mojang AB, the original developer of Minecraft. - */ - -package de.bixilon.minosoft.data.player.advancements; - -import de.bixilon.minosoft.data.inventory.ItemStack; -import de.bixilon.minosoft.data.text.ChatComponent; -import de.bixilon.minosoft.util.BitByte; - -public class AdvancementDisplay { - private final ChatComponent title; - private final ChatComponent description; - private final ItemStack icon; - private final AdvancementFrameTypes frameType; - private final int flags; - private final String backgroundTexture; - private final float x; - private final float y; - - public AdvancementDisplay(ChatComponent title, ChatComponent description, ItemStack icon, AdvancementFrameTypes frameType, int flags, String backgroundTexture, float x, float y) { - this.title = title; - this.description = description; - this.icon = icon; - this.frameType = frameType; - this.flags = flags; - this.backgroundTexture = backgroundTexture; - this.x = x; - this.y = y; - } - - public AdvancementDisplay(ChatComponent title, ChatComponent description, ItemStack icon, AdvancementFrameTypes frameType, int flags, float x, float y) { - this.title = title; - this.description = description; - this.icon = icon; - this.frameType = frameType; - this.flags = flags; - this.backgroundTexture = null; - this.x = x; - this.y = y; - } - - public ChatComponent getTitle() { - return this.title; - } - - public ChatComponent getDescription() { - return this.description; - } - - public ItemStack getIcon() { - return this.icon; - } - - public AdvancementFrameTypes getFrameType() { - return this.frameType; - } - - public boolean hasBackgroundTexture() { - return BitByte.isBitMask(this.flags, 0x01); - } - - public boolean showToast() { - return BitByte.isBitMask(this.flags, 0x02); - } - - public boolean isHidden() { - return BitByte.isBitMask(this.flags, 0x04); - } - - public String getBackgroundTexture() { - return this.backgroundTexture; - } - - public float getX() { - return this.x; - } - - public float getY() { - return this.y; - } - - public enum AdvancementFrameTypes { - TASK, - CHALLENGE, - GOAL; - - private static final AdvancementFrameTypes[] ADVANCEMENT_FRAME_TYPES = values(); - - public static AdvancementFrameTypes byId(int id) { - return ADVANCEMENT_FRAME_TYPES[id]; - } - } -} diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt index 870d25be4..dc1ae6b65 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt @@ -87,7 +87,7 @@ class PlayConnection( val tags: MutableMap>> = synchronizedMapOf() lateinit var language: LanguageManager - var commandRootNode: CommandRootNode? = null + var commandRoot: CommandRootNode? = null var rendering: Rendering? = null diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/interfaces/CompressionThresholdChange.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/interfaces/CompressionS2CP.kt similarity index 95% rename from src/main/java/de/bixilon/minosoft/protocol/packets/s2c/interfaces/CompressionThresholdChange.kt rename to src/main/java/de/bixilon/minosoft/protocol/packets/s2c/interfaces/CompressionS2CP.kt index ff6e22d0b..df439004d 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/interfaces/CompressionThresholdChange.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/interfaces/CompressionS2CP.kt @@ -15,7 +15,7 @@ package de.bixilon.minosoft.protocol.packets.s2c.interfaces import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket -interface CompressionThresholdChange : PlayS2CPacket { +interface CompressionS2CP : PlayS2CPacket { val threshold: Int override fun handle(connection: PlayConnection) { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/login/CompressionS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/login/CompressionS2CP.kt index 884db0da2..de60aa36a 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/login/CompressionS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/login/CompressionS2CP.kt @@ -13,7 +13,7 @@ package de.bixilon.minosoft.protocol.packets.s2c.login import de.bixilon.minosoft.protocol.packets.factory.LoadPacket -import de.bixilon.minosoft.protocol.packets.s2c.interfaces.CompressionThresholdChange +import de.bixilon.minosoft.protocol.packets.s2c.interfaces.CompressionS2CP import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer import de.bixilon.minosoft.protocol.protocol.ProtocolStates import de.bixilon.minosoft.util.logging.Log @@ -21,7 +21,7 @@ import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogMessageType @LoadPacket(state = ProtocolStates.LOGIN, threadSafe = false) -class CompressionS2CP(buffer: PlayInByteBuffer) : CompressionThresholdChange { +class CompressionS2CP(buffer: PlayInByteBuffer) : CompressionS2CP { override val threshold: Int = buffer.readVarInt() override fun log(reducedLog: Boolean) { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/CommandsS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/CommandsS2CP.kt new file mode 100644 index 000000000..e1f32f07a --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/CommandsS2CP.kt @@ -0,0 +1,73 @@ +/* + * Minosoft + * Copyright (C) 2020-2022 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ +package de.bixilon.minosoft.protocol.packets.s2c.play + +import de.bixilon.kutil.cast.CastUtil.unsafeCast +import de.bixilon.minosoft.data.commands.CommandArgumentNode +import de.bixilon.minosoft.data.commands.CommandLiteralNode +import de.bixilon.minosoft.data.commands.CommandNode +import de.bixilon.minosoft.data.commands.CommandRootNode +import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection +import de.bixilon.minosoft.protocol.packets.factory.LoadPacket +import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket +import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer +import de.bixilon.minosoft.util.logging.Log +import de.bixilon.minosoft.util.logging.LogLevels +import de.bixilon.minosoft.util.logging.LogMessageType + +@LoadPacket +class CommandsS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { + val nodes = buffer.readCommandNodeArray() + val root = nodes[buffer.readVarInt()].unsafeCast() + + override fun handle(connection: PlayConnection) { + connection.commandRoot = root + } + + override fun log(reducedLog: Boolean) { + Log.log(LogMessageType.NETWORK_PACKETS_IN, LogLevels.VERBOSE) { "Commands (nodes=$nodes, root=$root)" } + } + + fun PlayInByteBuffer.readCommandNode(): CommandNode { + val flags = readByte().toInt() + return when (CommandNode.NodeTypes.byId(flags and 0x03)!!) { + CommandNode.NodeTypes.ROOT -> CommandRootNode(flags, this) + CommandNode.NodeTypes.LITERAL -> CommandLiteralNode(flags, this) + CommandNode.NodeTypes.ARGUMENT -> CommandArgumentNode(flags, this) + } + } + + @JvmOverloads + @Deprecated("refactor") + fun PlayInByteBuffer.readCommandNodeArray(length: Int = readVarInt()): Array { + val nodes = readArray(length) { readCommandNode() } + for (node in nodes) { + if (node.redirectNodeId != -1) { + node.redirectNode = nodes[node.redirectNodeId] + } + + for (childId in node.childrenIds) { + when (val child = nodes[childId]) { + is CommandArgumentNode -> { + node.argumentsChildren.add(child) + } + is CommandLiteralNode -> { + node.literalChildren[child.name] = child + } + } + } + } + + return nodes + } +} diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/CompressionS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/CompressionS2CP.kt index a9b77645d..cdd8fd23c 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/CompressionS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/CompressionS2CP.kt @@ -13,14 +13,14 @@ package de.bixilon.minosoft.protocol.packets.s2c.play import de.bixilon.minosoft.protocol.packets.factory.LoadPacket -import de.bixilon.minosoft.protocol.packets.s2c.interfaces.CompressionThresholdChange +import de.bixilon.minosoft.protocol.packets.s2c.interfaces.CompressionS2CP import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer import de.bixilon.minosoft.util.logging.Log import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogMessageType @LoadPacket(threadSafe = false) -class CompressionS2CP(buffer: PlayInByteBuffer) : CompressionThresholdChange { +class CompressionS2CP(buffer: PlayInByteBuffer) : CompressionS2CP { override val threshold: Int = buffer.readVarInt() override fun log(reducedLog: Boolean) { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketAdvancements.java b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketAdvancements.java deleted file mode 100644 index 68be4019b..000000000 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketAdvancements.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Minosoft - * Copyright (C) 2020-2022 Moritz Zwerger - * - * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program. If not, see . - * - * This software is not affiliated with Mojang AB, the original developer of Minecraft. - */ - -package de.bixilon.minosoft.protocol.packets.s2c.play; - -import de.bixilon.minosoft.data.inventory.ItemStack; -import de.bixilon.minosoft.data.player.advancements.Advancement; -import de.bixilon.minosoft.data.player.advancements.AdvancementDisplay; -import de.bixilon.minosoft.data.player.advancements.AdvancementProgress; -import de.bixilon.minosoft.data.player.advancements.CriterionProgress; -import de.bixilon.minosoft.data.text.ChatComponent; -import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection; -import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket; -import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer; -import de.bixilon.minosoft.util.BitByte; -import de.bixilon.minosoft.util.logging.Log; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.HashMap; - -@Deprecated -public class PacketAdvancements implements PlayS2CPacket { - private final HashMap advancements = new HashMap<>(); - private final HashMap progresses = new HashMap<>(); - private final boolean reset; - private final String[] toRemove; - - public PacketAdvancements(PlayInByteBuffer buffer) { - this.reset = buffer.readBoolean(); - int length = buffer.readVarInt(); - for (int i = 0; i < length; i++) { - String advancementKey = buffer.readString(); - - String parentName = null; - if (buffer.readBoolean()) { - parentName = buffer.readString(); - } - AdvancementDisplay display = null; - if (buffer.readBoolean()) { - ChatComponent title = buffer.readChatComponent(); - ChatComponent description = buffer.readChatComponent(); - ItemStack icon = buffer.readItemStack(); - AdvancementDisplay.AdvancementFrameTypes frameType = AdvancementDisplay.AdvancementFrameTypes.byId(buffer.readVarInt()); - int flags = buffer.readInt(); - String backgroundTexture = null; - if (BitByte.isBitMask(flags, 0x01)) { - backgroundTexture = buffer.readString(); - } - float x = buffer.readFloat(); - float y = buffer.readFloat(); - display = new AdvancementDisplay(title, description, icon, frameType, flags, backgroundTexture, x, y); - } - int criteriaCount = buffer.readVarInt(); - ArrayList criteria = new ArrayList<>(); - for (int ii = 0; ii < criteriaCount; ii++) { - criteria.add(buffer.readString()); - } - int requirementsCount = buffer.readVarInt(); - ArrayList requirements = new ArrayList<>(); - for (int ii = 0; ii < requirementsCount; ii++) { - String[] requirement = new String[buffer.readVarInt()]; - for (int iii = 0; iii < requirement.length; iii++) { - requirement[iii] = buffer.readString(); - } - requirements.add(requirement); - } - this.advancements.put(advancementKey, new Advancement(parentName, display, criteria, requirements)); - } - this.toRemove = new String[buffer.readVarInt()]; - for (int i = 0; i < this.toRemove.length; i++) { - this.toRemove[i] = buffer.readString(); - } - int progressesLength = buffer.readVarInt(); - for (int i = 0; i < progressesLength; i++) { - HashMap progress = new HashMap<>(); - String progressName = buffer.readString(); - int criterionLength = buffer.readVarInt(); - for (int ii = 0; ii < criterionLength; ii++) { - String criterionName = buffer.readString(); - boolean archived = buffer.readBoolean(); - Long archiveTime = null; - if (archived) { - archiveTime = buffer.readLong(); - } - CriterionProgress criterionProgress = new CriterionProgress(archived, archiveTime); - progress.put(criterionName, criterionProgress); - } - this.progresses.put(progressName, new AdvancementProgress(progress)); - } - } - - @Override - public void log(boolean reducedLog) { - Log.protocol(String.format("[IN] Receiving advancements (reset=%s, advancements=%s, progresses=%s)", this.reset, this.advancements.size(), this.progresses.size())); - } - - public boolean isReset() { - return this.reset; - } - - public HashMap getAdvancements() { - return this.advancements; - } - - public HashMap getProgresses() { - return this.progresses; - } - - @Override - public void handle(@NotNull PlayConnection connection) { - - } - - @Override - public void check(@NotNull PlayConnection connection) { - - } -} diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketDeclareCommands.java b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketDeclareCommands.java deleted file mode 100644 index 0549b6def..000000000 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketDeclareCommands.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Minosoft - * Copyright (C) 2020-2022 Moritz Zwerger - * - * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program. If not, see . - * - * This software is not affiliated with Mojang AB, the original developer of Minecraft. - */ - -package de.bixilon.minosoft.protocol.packets.s2c.play; - -import de.bixilon.minosoft.data.commands.CommandNode; -import de.bixilon.minosoft.data.commands.CommandRootNode; -import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection; -import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket; -import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer; -import de.bixilon.minosoft.util.logging.Log; -import org.jetbrains.annotations.NotNull; - -@Deprecated -public class PacketDeclareCommands implements PlayS2CPacket { - private final CommandRootNode rootNode; - - public PacketDeclareCommands(PlayInByteBuffer buffer) { - CommandNode[] nodes = buffer.readCommandNodeArray(); - this.rootNode = (CommandRootNode) nodes[buffer.readVarInt()]; - } - - @Override - public void handle(PlayConnection connection) { - connection.setCommandRootNode(getRootNode()); - } - - public CommandRootNode getRootNode() { - return this.rootNode; - } - - @Override - public void log(boolean reducedLog) { - Log.protocol("Received declare commands packets"); - } - - @Override - public void check(@NotNull PlayConnection connection) { - - } -} diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketSelectAdvancementTab.java b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketSelectAdvancementTab.java deleted file mode 100644 index 4ff8af5bc..000000000 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/PacketSelectAdvancementTab.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Minosoft - * Copyright (C) 2020-2022 Moritz Zwerger - * - * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program. If not, see . - * - * This software is not affiliated with Mojang AB, the original developer of Minecraft. - */ - -package de.bixilon.minosoft.protocol.packets.s2c.play; - -import de.bixilon.minosoft.data.registries.ResourceLocation; -import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection; -import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket; -import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer; -import de.bixilon.minosoft.util.logging.Log; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; - -@Deprecated -public class PacketSelectAdvancementTab implements PlayS2CPacket { - private AdvancementTabs tab; - - public PacketSelectAdvancementTab(PlayInByteBuffer buffer) { - if (buffer.readBoolean()) { - this.tab = AdvancementTabs.VALUES.get(buffer.readResourceLocation()); - } - } - - @Override - public void log(boolean reducedLog) { - Log.protocol(String.format("[IN] Received select advancement tab (tab=%s)", this.tab)); - } - - public AdvancementTabs getTab() { - return this.tab; - } - - @Override - public void handle(@NotNull PlayConnection connection) { - - } - - @Override - public void check(@NotNull PlayConnection connection) { - - } - - public enum AdvancementTabs { - STORY(new ResourceLocation("story/root")), - NETHER(new ResourceLocation("nether/root")), - END(new ResourceLocation("end/root")), - ADVENTURE(new ResourceLocation("adventure/root")), - HUSBANDRY(new ResourceLocation("husbandry/root")); - - public static final HashMap VALUES = new HashMap<>(); - - static { - for (AdvancementTabs tab : values()) { - VALUES.put(tab.resourceLocation, tab); - } - } - - private final ResourceLocation resourceLocation; - - AdvancementTabs(ResourceLocation resourceLocation) { - this.resourceLocation = resourceLocation; - } - - public ResourceLocation getResourceLocation() { - return this.resourceLocation; - } - } -} diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/advancement/AdvancementTabS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/advancement/AdvancementTabS2CP.kt new file mode 100644 index 000000000..bce07a9ca --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/advancement/AdvancementTabS2CP.kt @@ -0,0 +1,31 @@ +/* + * Minosoft + * Copyright (C) 2020-2022 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.protocol.packets.s2c.play.advancement + +import de.bixilon.minosoft.protocol.packets.factory.LoadPacket +import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket +import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer +import de.bixilon.minosoft.util.logging.Log +import de.bixilon.minosoft.util.logging.LogLevels +import de.bixilon.minosoft.util.logging.LogMessageType + +@LoadPacket +class AdvancementTabS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { + val tab = buffer.readPlayOptional { readResourceLocation() } + + + override fun log(reducedLog: Boolean) { + Log.log(LogMessageType.NETWORK_PACKETS_IN, LogLevels.VERBOSE) { "Advancement tab (tab=$tab)" } + } +} diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/advancement/AdvancementsS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/advancement/AdvancementsS2CP.kt new file mode 100644 index 000000000..ab4a5a481 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/advancement/AdvancementsS2CP.kt @@ -0,0 +1,94 @@ +/* + * Minosoft + * Copyright (C) 2020-2022 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.protocol.packets.s2c.play.advancement + +import de.bixilon.minosoft.advancements.Advancement +import de.bixilon.minosoft.advancements.AdvancementDisplay +import de.bixilon.minosoft.advancements.AdvancementFrames +import de.bixilon.minosoft.advancements.AdvancementProgress +import de.bixilon.minosoft.protocol.packets.factory.LoadPacket +import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket +import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer +import de.bixilon.minosoft.util.BitByte.isBit +import de.bixilon.minosoft.util.logging.Log +import de.bixilon.minosoft.util.logging.LogLevels +import de.bixilon.minosoft.util.logging.LogMessageType + +@LoadPacket +class AdvancementsS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { + val reset = buffer.readBoolean() + val advancements: Map + val progress: Map> + + init { + val advancements: MutableMap = mutableMapOf() + for (i in 0 until buffer.readVarInt()) { + val key = buffer.readString() + val parent = buffer.readOptional { readString() } + val display = buffer.readPlayOptional { readDisplay() } + val criteria = buffer.readStringArray().toSet() + val requirements = buffer.readArray { buffer.readStringArray().toSet() }.toSet() + + advancements[key] = Advancement( + parent = parent, + display = display, + criteria = criteria, + requirements = requirements, + ) + } + for (remove in buffer.readStringArray()) { + advancements[remove] = null + } + this.advancements = advancements + + val progress: MutableMap> = mutableMapOf() + for (i in 0 until buffer.readVarInt()) { + val name = buffer.readString() + val criteria: MutableSet = mutableSetOf() + for (ii in 0 until buffer.readVarInt()) { + val criterion = buffer.readString() + val archiveTime = buffer.readOptional { readLong() } + criteria += AdvancementProgress( + criterion = criterion, + archiveTime = archiveTime, + ) + } + progress[name] = criteria + } + this.progress = progress + } + + override fun log(reducedLog: Boolean) { + Log.log(LogMessageType.NETWORK_PACKETS_IN, LogLevels.VERBOSE) { "Advancements (reset=$reset, advancements=$advancements, progress=$progress)" } + } + + fun PlayInByteBuffer.readDisplay(): AdvancementDisplay { + val title = readChatComponent() + val description = readChatComponent() + val icon = readItemStack() + val frame = AdvancementFrames[readVarInt()] + val flags = readInt() + val background = if (flags.isBit(0)) readString() else null + val position = readVec2f() + + return AdvancementDisplay( + title = title, + description = description, + icon = icon, + frame = frame, + background = background, + position = position, + ) + } +} diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.kt b/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.kt index b2ea53c50..d7cc8805e 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020 Moritz Zwerger + * Copyright (C) 2020-2022 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -13,10 +13,6 @@ package de.bixilon.minosoft.protocol.protocol import de.bixilon.kutil.uuid.UUIDUtil.toUUID -import de.bixilon.minosoft.data.commands.CommandArgumentNode -import de.bixilon.minosoft.data.commands.CommandLiteralNode -import de.bixilon.minosoft.data.commands.CommandNode -import de.bixilon.minosoft.data.commands.CommandRootNode import de.bixilon.minosoft.data.direction.Directions import de.bixilon.minosoft.data.entities.Poses import de.bixilon.minosoft.data.registries.ResourceLocation @@ -25,6 +21,7 @@ import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.util.Util import de.bixilon.minosoft.util.json.Jackson import de.bixilon.minosoft.util.nbt.tag.NBTTagTypes +import glm_.vec2.Vec2 import glm_.vec2.Vec2i import glm_.vec3.Vec3 import glm_.vec3.Vec3d @@ -299,14 +296,18 @@ open class InByteBuffer { return (readByte() * ProtocolDefinition.ANGLE_CALCULATION_CONSTANT).toInt() } - fun readVec3d(): Vec3d { - return Vec3d(readDouble(), readDouble(), readDouble()) + fun readVec2f(): Vec2 { + return Vec2(readFloat(), readFloat()) } fun readVec3f(): Vec3 { return Vec3(readFloat(), readFloat(), readFloat()) } + fun readVec3d(): Vec3d { + return Vec3d(readDouble(), readDouble(), readDouble()) + } + fun readByteBlockPosition(): Vec3i { return Vec3i(readInt(), readByte(), readInt()) } @@ -323,39 +324,6 @@ open class InByteBuffer { return ResourceLocation.getResourceLocation(readString()) } - - fun readCommandNode(): CommandNode { - val flags = readByte().toInt() - return when (CommandNode.NodeTypes.byId(flags and 0x03)!!) { - CommandNode.NodeTypes.ROOT -> CommandRootNode(flags, this) - CommandNode.NodeTypes.LITERAL -> CommandLiteralNode(flags, this) - CommandNode.NodeTypes.ARGUMENT -> CommandArgumentNode(flags, this) - } - } - - @JvmOverloads - fun readCommandNodeArray(length: Int = readVarInt()): Array { - val nodes = readArray(length) { readCommandNode() } - for (node in nodes) { - if (node.redirectNodeId != -1) { - node.redirectNode = nodes[node.redirectNodeId] - } - - for (childId in node.childrenIds) { - when (val child = nodes[childId]) { - is CommandArgumentNode -> { - node.argumentsChildren.add(child) - } - is CommandLiteralNode -> { - node.literalChildren[child.name] = child - } - } - } - } - - return nodes - } - fun readChunkPosition(): Vec2i { return Vec2i(readInt(), readInt()) } @@ -443,9 +411,9 @@ open class InByteBuffer { return mapOf(*(readArray(length) { readTag(idResolver) })) } - fun readOptional(reader: () -> T): T? { + fun readOptional(reader: InByteBuffer.() -> T): T? { return if (readBoolean()) { - reader() + reader(this) } else { null } diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/PlayInByteBuffer.kt b/src/main/java/de/bixilon/minosoft/protocol/protocol/PlayInByteBuffer.kt index 7fe699ed9..bfee054cd 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/PlayInByteBuffer.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/PlayInByteBuffer.kt @@ -240,4 +240,12 @@ class PlayInByteBuffer : InByteBuffer { textures = textures, ) } + + fun readPlayOptional(reader: PlayInByteBuffer.() -> T): T? { + return if (readBoolean()) { + reader(this) + } else { + null + } + } } diff --git a/src/main/java/de/bixilon/minosoft/terminal/commands/commands/CommandSendChat.java b/src/main/java/de/bixilon/minosoft/terminal/commands/commands/CommandSendChat.java index cb6b2b0c7..6a41eb909 100644 --- a/src/main/java/de/bixilon/minosoft/terminal/commands/commands/CommandSendChat.java +++ b/src/main/java/de/bixilon/minosoft/terminal/commands/commands/CommandSendChat.java @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020 Moritz Zwerger + * Copyright (C) 2020-2022 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -32,9 +32,9 @@ public class CommandSendChat extends Command { // command String command = message.substring(1); try { - CommandRootNode rootNode = connection.getCommandRootNode(); + CommandRootNode rootNode = connection.getCommandRoot(); if (rootNode != null) { - connection.getCommandRootNode().parse(connection, command); + connection.getCommandRoot().parse(connection, command); } } catch (CommandParseException e) { printError("Command \"%s\" is invalid, %s: %s", command, e.getClass().getSimpleName(), e.getMessage()); diff --git a/src/main/resources/assets/minosoft/mapping/versions.json b/src/main/resources/assets/minosoft/mapping/versions.json index 309e2000d..7de456c30 100644 --- a/src/main/resources/assets/minosoft/mapping/versions.json +++ b/src/main/resources/assets/minosoft/mapping/versions.json @@ -1623,7 +1623,7 @@ "packets": { "c2s": ["confirm_teleport", "chat_suggestions", "chat_message", "client_action", "settings", "container_action", "container_button", "container_click", "close_container", "plugin", "entity_interact", "heartbeat", "position", "position_rotation", "rotation", "ground_change", "move_vehicle", "steer_boat", "toggle_fly", "player_action", "entity_action", "steer_vehicle", "resourcepack", "hotbar_slot", "item_stack_create", "sign_text", "swing_arm", "entity_spectate", "block_interact", "use_item"], "s2c": [ - "entity_object_spawn", "entity_experience_orb", "global_entity_spawn", "entity_mob_spawn", "entity_painting", "entity_player", "entity_animation", "statistics", "block_break_animation", "block_data", "block_action", "block", "bossbar", "difficulty", "chat_suggestions", "chat_message", "blocks", "container_action", "close_container", "open_container", "container_items", "container_properties", "container_item", "item_cooldown", "plugin", "named_sound", "kick", "entity_status", "explosion", "unload_chunk", "compression_threshold", "game_event", "heartbeat", "chunk", "world_event", "particle", "initialize", "map", "relative_move", "movement_rotation", "rotation", "empty_move", "move_vehicle", "sign_editor", "player_abilities", "combat_event", "tab_list", "position_rotation", "entity_sleep", "entity_destroy", "entity_remove_effect", "resourcepack", "respawn", "head_rotation", "world_border", "camera", "hotbar_slot", "objective_position", "entity_data", "entity_attach", "velocity", "entity_equipment", "experience", "health", "objective", "entity_passenger", "teams", "scoreboard_score", "compass_position", "time", "title", "sign_text", "sound_event", "tab_list_text", "entity_collect", "teleport", "entity_attributes", "entity_effect" + "entity_object_spawn", "entity_experience_orb", "global_entity_spawn", "entity_mob_spawn", "entity_painting", "entity_player", "entity_animation", "statistics", "block_break_animation", "block_data", "block_action", "block", "bossbar", "difficulty", "chat_suggestions", "chat_message", "blocks", "container_action", "close_container", "open_container", "container_items", "container_properties", "container_item", "item_cooldown", "plugin", "named_sound", "kick", "entity_status", "explosion", "unload_chunk", "compression", "game_event", "heartbeat", "chunk", "world_event", "particle", "initialize", "map", "relative_move", "movement_rotation", "rotation", "empty_move", "move_vehicle", "sign_editor", "player_abilities", "combat_event", "tab_list", "position_rotation", "entity_sleep", "entity_destroy", "entity_remove_effect", "resourcepack", "respawn", "head_rotation", "world_border", "camera", "hotbar_slot", "objective_position", "entity_data", "entity_attach", "velocity", "entity_equipment", "experience", "health", "objective", "entity_passenger", "teams", "scoreboard_score", "compass_position", "time", "title", "sign_text", "sound_event", "tab_list_text", "entity_collect", "teleport", "entity_attributes", "entity_effect" ] } }, @@ -1632,7 +1632,7 @@ "packets": { "c2s": ["chat_suggestions", "chat_message", "client_action", "settings", "container_action", "container_button", "container_click", "close_container", "plugin", "entity_interact", "heartbeat", "move_vehicle", "position", "position_rotation", "rotation", "ground_change", "toggle_fly", "player_action", "entity_action", "steer_vehicle", "resourcepack", "hotbar_slot", "item_stack_create", "sign_text", "swing_arm", "entity_spectate", "block_interact", "use_item", "steer_boat", "confirm_teleport"], "s2c": [ - "entity_object_spawn", "entity_experience_orb", "global_entity_spawn", "entity_mob_spawn", "entity_painting", "entity_player", "entity_animation", "statistics", "block_break_animation", "block_data", "block_action", "block", "bossbar", "difficulty", "chat_suggestions", "chat_message", "blocks", "container_action", "close_container", "open_container", "container_items", "container_properties", "container_item", "item_cooldown", "plugin", "kick", "entity_status", "explosion", "unload_chunk", "compression_threshold", "game_event", "heartbeat", "chunk", "world_event", "particle", "named_sound", "initialize", "map", "relative_move", "movement_rotation", "rotation", "empty_move", "sign_editor", "player_abilities", "combat_event", "tab_list", "position_rotation", "entity_sleep", "entity_destroy", "entity_remove_effect", "resourcepack", "respawn", "head_rotation", "world_border", "camera", "hotbar_slot", "objective_position", "entity_data", "entity_passenger", "entity_attach", "velocity", "entity_equipment", "experience", "health", "objective", "teams", "scoreboard_score", "compass_position", "time", "title", "sign_text", "tab_list_text", "entity_collect", "teleport", "entity_attributes", "entity_effect" + "entity_object_spawn", "entity_experience_orb", "global_entity_spawn", "entity_mob_spawn", "entity_painting", "entity_player", "entity_animation", "statistics", "block_break_animation", "block_data", "block_action", "block", "bossbar", "difficulty", "chat_suggestions", "chat_message", "blocks", "container_action", "close_container", "open_container", "container_items", "container_properties", "container_item", "item_cooldown", "plugin", "kick", "entity_status", "explosion", "unload_chunk", "compression", "game_event", "heartbeat", "chunk", "world_event", "particle", "named_sound", "initialize", "map", "relative_move", "movement_rotation", "rotation", "empty_move", "sign_editor", "player_abilities", "combat_event", "tab_list", "position_rotation", "entity_sleep", "entity_destroy", "entity_remove_effect", "resourcepack", "respawn", "head_rotation", "world_border", "camera", "hotbar_slot", "objective_position", "entity_data", "entity_passenger", "entity_attach", "velocity", "entity_equipment", "experience", "health", "objective", "teams", "scoreboard_score", "compass_position", "time", "title", "sign_text", "tab_list_text", "entity_collect", "teleport", "entity_attributes", "entity_effect" ] } }, @@ -1645,7 +1645,7 @@ "packets": { "c2s": ["chat_suggestions", "chat_message", "client_action", "settings", "container_action", "container_button", "container_click", "close_container", "plugin", "entity_interact", "heartbeat", "move_vehicle", "position", "position_rotation", "rotation", "ground_change", "toggle_fly", "player_action", "entity_action", "steer_vehicle", "resourcepack", "hotbar_slot", "item_stack_create", "sign_text", "swing_arm", "entity_spectate", "block_interact", "use_item", "steer_boat"], "s2c": [ - "entity_object_spawn", "entity_experience_orb", "global_entity_spawn", "entity_mob_spawn", "entity_painting", "entity_player", "entity_animation", "statistics", "block_break_animation", "block_data", "block_action", "block", "bossbar", "difficulty", "chat_suggestions", "chat_message", "blocks", "container_action", "close_container", "open_container", "container_items", "container_properties", "container_item", "item_cooldown", "plugin", "kick", "entity_status", "explosion", "unload_chunk", "compression_threshold", "game_event", "heartbeat", "chunk", "world_event", "particle", "named_sound", "initialize", "map", "relative_move", "movement_rotation", "rotation", "empty_move", "sign_editor", "player_abilities", "combat_event", "tab_list", "position_rotation", "entity_sleep", "entity_destroy", "entity_remove_effect", "resourcepack", "respawn", "head_rotation", "world_border", "camera", "hotbar_slot", "objective_position", "entity_data", "entity_passenger", "entity_attach", "velocity", "entity_equipment", "experience", "health", "objective", "teams", "scoreboard_score", "compass_position", "time", "title", "sign_text", "tab_list_text", "entity_collect", "teleport", "entity_attributes", "entity_effect" + "entity_object_spawn", "entity_experience_orb", "global_entity_spawn", "entity_mob_spawn", "entity_painting", "entity_player", "entity_animation", "statistics", "block_break_animation", "block_data", "block_action", "block", "bossbar", "difficulty", "chat_suggestions", "chat_message", "blocks", "container_action", "close_container", "open_container", "container_items", "container_properties", "container_item", "item_cooldown", "plugin", "kick", "entity_status", "explosion", "unload_chunk", "compression", "game_event", "heartbeat", "chunk", "world_event", "particle", "named_sound", "initialize", "map", "relative_move", "movement_rotation", "rotation", "empty_move", "sign_editor", "player_abilities", "combat_event", "tab_list", "position_rotation", "entity_sleep", "entity_destroy", "entity_remove_effect", "resourcepack", "respawn", "head_rotation", "world_border", "camera", "hotbar_slot", "objective_position", "entity_data", "entity_passenger", "entity_attach", "velocity", "entity_equipment", "experience", "health", "objective", "teams", "scoreboard_score", "compass_position", "time", "title", "sign_text", "tab_list_text", "entity_collect", "teleport", "entity_attributes", "entity_effect" ] } }, @@ -1690,7 +1690,7 @@ "packets": { "c2s": ["chat_suggestions", "chat_message", "client_action", "settings", "container_action", "container_button", "container_click", "close_container", "plugin", "entity_interact", "heartbeat", "position", "position_rotation", "rotation", "ground_change", "toggle_fly", "player_action", "entity_action", "steer_vehicle", "resourcepack", "hotbar_slot", "item_stack_create", "sign_text", "swing_arm", "entity_spectate", "block_interact", "use_item"], "s2c": [ - "entity_object_spawn", "entity_experience_orb", "global_entity_spawn", "entity_mob_spawn", "entity_painting", "entity_player", "entity_animation", "statistics", "block_break_animation", "block_data", "block_action", "block", "bossbar", "difficulty", "chat_suggestions", "chat_message", "blocks", "container_action", "close_container", "open_container", "container_items", "container_properties", "container_item", "item_cooldown", "plugin", "kick", "entity_status", "explosion", "unload_chunk", "compression_threshold", "game_event", "heartbeat", "chunk", "world_event", "particle", "named_sound", "initialize", "map", "relative_move", "movement_rotation", "rotation", "empty_move", "sign_editor", "player_abilities", "combat_event", "tab_list", "position_rotation", "entity_sleep", "entity_destroy", "entity_remove_effect", "resourcepack", "respawn", "head_rotation", "world_border", "camera", "hotbar_slot", "objective_position", "entity_data", "entity_attach", "velocity", "entity_equipment", "experience", "health", "objective", "teams", "scoreboard_score", "compass_position", "time", "title", "sign_text", "tab_list_text", "entity_collect", "teleport", "entity_attributes", "entity_effect" + "entity_object_spawn", "entity_experience_orb", "global_entity_spawn", "entity_mob_spawn", "entity_painting", "entity_player", "entity_animation", "statistics", "block_break_animation", "block_data", "block_action", "block", "bossbar", "difficulty", "chat_suggestions", "chat_message", "blocks", "container_action", "close_container", "open_container", "container_items", "container_properties", "container_item", "item_cooldown", "plugin", "kick", "entity_status", "explosion", "unload_chunk", "compression", "game_event", "heartbeat", "chunk", "world_event", "particle", "named_sound", "initialize", "map", "relative_move", "movement_rotation", "rotation", "empty_move", "sign_editor", "player_abilities", "combat_event", "tab_list", "position_rotation", "entity_sleep", "entity_destroy", "entity_remove_effect", "resourcepack", "respawn", "head_rotation", "world_border", "camera", "hotbar_slot", "objective_position", "entity_data", "entity_attach", "velocity", "entity_equipment", "experience", "health", "objective", "teams", "scoreboard_score", "compass_position", "time", "title", "sign_text", "tab_list_text", "entity_collect", "teleport", "entity_attributes", "entity_effect" ] } }, @@ -1715,7 +1715,7 @@ "packets": { "c2s": ["heartbeat", "chat_message", "entity_interact", "ground_change", "position", "rotation", "position_rotation", "player_action", "use_item", "block_interact", "hotbar_slot", "swing_arm", "entity_action", "steer_vehicle", "close_container", "container_click", "container_action", "item_stack_create", "container_button", "sign_text", "toggle_fly", "chat_suggestions", "settings", "client_action", "plugin", "entity_spectate", "resourcepack"], "s2c": [ - "heartbeat", "initialize", "chat_message", "time", "entity_equipment", "compass_position", "health", "respawn", "position_rotation", "hotbar_slot", "entity_sleep", "entity_animation", "entity_player", "entity_collect", "entity_object_spawn", "entity_mob_spawn", "entity_painting", "entity_experience_orb", "velocity", "entity_destroy", "empty_move", "relative_move", "rotation", "movement_rotation", "teleport", "head_rotation", "entity_status", "entity_attach", "entity_data", "entity_effect", "entity_remove_effect", "experience", "entity_attributes", "chunk", "unload_chunk", "blocks", "block_action", "block_break_animation", "explosion", "world_event", "named_sound", "particle", "game_event", "global_entity_spawn", "open_container", "close_container", "container_item", "container_items", "container_properties", "container_action", "sign_text", "map", "block_data", "sign_editor", "statistics", "tab_list", "player_abilities", "chat_suggestions", "objective", "scoreboard_score", "objective_position", "teams", "plugin", "kick", "difficulty", "combat_event", "camera", "world_border", "title", "compression_threshold", "tab_list_text", "resourcepack", "bossbar", "item_cooldown" + "heartbeat", "initialize", "chat_message", "time", "entity_equipment", "compass_position", "health", "respawn", "position_rotation", "hotbar_slot", "entity_sleep", "entity_animation", "entity_player", "entity_collect", "entity_object_spawn", "entity_mob_spawn", "entity_painting", "entity_experience_orb", "velocity", "entity_destroy", "empty_move", "relative_move", "rotation", "movement_rotation", "teleport", "head_rotation", "entity_status", "entity_attach", "entity_data", "entity_effect", "entity_remove_effect", "experience", "entity_attributes", "chunk", "unload_chunk", "blocks", "block_action", "block_break_animation", "explosion", "world_event", "named_sound", "particle", "game_event", "global_entity_spawn", "open_container", "close_container", "container_item", "container_items", "container_properties", "container_action", "sign_text", "map", "block_data", "sign_editor", "statistics", "tab_list", "player_abilities", "chat_suggestions", "objective", "scoreboard_score", "objective_position", "teams", "plugin", "kick", "difficulty", "combat_event", "camera", "world_border", "title", "compression", "tab_list_text", "resourcepack", "bossbar", "item_cooldown" ] } }, @@ -1728,7 +1728,7 @@ "packets": { "c2s": ["heartbeat", "chat_message", "entity_interact", "ground_change", "position", "rotation", "position_rotation", "player_action", "use_item", "block_interact", "hotbar_slot", "swing_arm", "entity_action", "steer_vehicle", "close_container", "container_click", "container_action", "item_stack_create", "container_button", "sign_text", "toggle_fly", "chat_suggestions", "settings", "client_action", "plugin", "entity_spectate", "resourcepack"], "s2c": [ - "heartbeat", "initialize", "chat_message", "time", "entity_equipment", "compass_position", "health", "respawn", "position_rotation", "hotbar_slot", "entity_sleep", "entity_animation", "entity_player", "entity_collect", "entity_object_spawn", "entity_mob_spawn", "entity_painting", "entity_experience_orb", "velocity", "entity_destroy", "empty_move", "relative_move", "rotation", "movement_rotation", "teleport", "head_rotation", "entity_status", "entity_attach", "entity_data", "entity_effect", "entity_remove_effect", "experience", "entity_attributes", "chunk", "blocks", "block", "block_action", "block_break_animation", "chunks", "explosion", "world_event", "named_sound", "particle", "game_event", "global_entity_spawn", "open_container", "close_container", "container_item", "container_items", "container_properties", "container_action", "sign_text", "map", "block_data", "sign_editor", "statistics", "tab_list", "player_abilities", "chat_suggestions", "objective", "scoreboard_score", "objective_position", "teams", "plugin", "kick", "difficulty", "combat_event", "camera", "world_border", "title", "compression_threshold", "tab_list_text", "resourcepack", "bossbar", "item_cooldown" + "heartbeat", "initialize", "chat_message", "time", "entity_equipment", "compass_position", "health", "respawn", "position_rotation", "hotbar_slot", "entity_sleep", "entity_animation", "entity_player", "entity_collect", "entity_object_spawn", "entity_mob_spawn", "entity_painting", "entity_experience_orb", "velocity", "entity_destroy", "empty_move", "relative_move", "rotation", "movement_rotation", "teleport", "head_rotation", "entity_status", "entity_attach", "entity_data", "entity_effect", "entity_remove_effect", "experience", "entity_attributes", "chunk", "blocks", "block", "block_action", "block_break_animation", "chunks", "explosion", "world_event", "named_sound", "particle", "game_event", "global_entity_spawn", "open_container", "close_container", "container_item", "container_items", "container_properties", "container_action", "sign_text", "map", "block_data", "sign_editor", "statistics", "tab_list", "player_abilities", "chat_suggestions", "objective", "scoreboard_score", "objective_position", "teams", "plugin", "kick", "difficulty", "combat_event", "camera", "world_border", "title", "compression", "tab_list_text", "resourcepack", "bossbar", "item_cooldown" ] } }, @@ -1777,7 +1777,7 @@ "packets": { "c2s": ["heartbeat", "chat_message", "entity_interact", "ground_change", "position", "rotation", "position_rotation", "player_action", "use_item", "block_interact", "hotbar_slot", "swing_arm", "entity_action", "steer_vehicle", "close_container", "container_click", "container_action", "item_stack_create", "container_button", "sign_text", "toggle_fly", "chat_suggestions", "settings", "client_action", "plugin", "entity_spectate", "resourcepack"], "s2c": [ - "heartbeat", "initialize", "chat_message", "time", "entity_equipment", "compass_position", "health", "respawn", "position_rotation", "hotbar_slot", "entity_sleep", "entity_animation", "entity_player", "entity_collect", "entity_object_spawn", "entity_mob_spawn", "entity_painting", "entity_experience_orb", "velocity", "entity_destroy", "empty_move", "relative_move", "rotation", "movement_rotation", "teleport", "head_rotation", "entity_status", "entity_attach", "entity_data", "entity_effect", "entity_remove_effect", "experience", "entity_attributes", "chunk", "blocks", "block", "block_action", "block_break_animation", "chunks", "explosion", "world_event", "named_sound", "particle", "game_event", "global_entity_spawn", "open_container", "close_container", "container_item", "container_items", "container_properties", "container_action", "sign_text", "map", "block_data", "sign_editor", "statistics", "tab_list", "player_abilities", "chat_suggestions", "objective", "scoreboard_score", "objective_position", "teams", "plugin", "kick", "difficulty", "combat_event", "camera", "world_border", "title", "compression_threshold", "tab_list_text", "resourcepack", "bossbar" + "heartbeat", "initialize", "chat_message", "time", "entity_equipment", "compass_position", "health", "respawn", "position_rotation", "hotbar_slot", "entity_sleep", "entity_animation", "entity_player", "entity_collect", "entity_object_spawn", "entity_mob_spawn", "entity_painting", "entity_experience_orb", "velocity", "entity_destroy", "empty_move", "relative_move", "rotation", "movement_rotation", "teleport", "head_rotation", "entity_status", "entity_attach", "entity_data", "entity_effect", "entity_remove_effect", "experience", "entity_attributes", "chunk", "blocks", "block", "block_action", "block_break_animation", "chunks", "explosion", "world_event", "named_sound", "particle", "game_event", "global_entity_spawn", "open_container", "close_container", "container_item", "container_items", "container_properties", "container_action", "sign_text", "map", "block_data", "sign_editor", "statistics", "tab_list", "player_abilities", "chat_suggestions", "objective", "scoreboard_score", "objective_position", "teams", "plugin", "kick", "difficulty", "combat_event", "camera", "world_border", "title", "compression", "tab_list_text", "resourcepack", "bossbar" ] } }, @@ -1843,7 +1843,7 @@ "packets": { "c2s": ["heartbeat", "chat_message", "entity_interact", "ground_change", "position", "rotation", "position_rotation", "player_action", "block_interact", "hotbar_slot", "swing_arm", "entity_action", "steer_vehicle", "close_container", "container_click", "container_action", "item_stack_create", "container_button", "sign_text", "toggle_fly", "chat_suggestions", "settings", "client_action", "plugin", "entity_spectate", "resourcepack"], "s2c": [ - "heartbeat", "initialize", "chat_message", "time", "entity_equipment", "compass_position", "health", "respawn", "position_rotation", "hotbar_slot", "entity_sleep", "entity_animation", "entity_player", "entity_collect", "entity_object_spawn", "entity_mob_spawn", "entity_painting", "entity_experience_orb", "velocity", "entity_destroy", "empty_move", "relative_move", "rotation", "movement_rotation", "teleport", "head_rotation", "entity_status", "entity_attach", "entity_data", "entity_effect", "entity_remove_effect", "experience", "entity_attributes", "chunk", "blocks", "block", "block_action", "block_break_animation", "chunks", "explosion", "world_event", "named_sound", "particle", "game_event", "global_entity_spawn", "open_container", "close_container", "container_item", "container_items", "container_properties", "container_action", "sign_text", "map", "block_data", "sign_editor", "statistics", "tab_list", "player_abilities", "chat_suggestions", "objective", "scoreboard_score", "objective_position", "teams", "plugin", "kick", "difficulty", "combat_event", "camera", "world_border", "title", "compression_threshold", "tab_list_text", "resourcepack", "nbt_response" + "heartbeat", "initialize", "chat_message", "time", "entity_equipment", "compass_position", "health", "respawn", "position_rotation", "hotbar_slot", "entity_sleep", "entity_animation", "entity_player", "entity_collect", "entity_object_spawn", "entity_mob_spawn", "entity_painting", "entity_experience_orb", "velocity", "entity_destroy", "empty_move", "relative_move", "rotation", "movement_rotation", "teleport", "head_rotation", "entity_status", "entity_attach", "entity_data", "entity_effect", "entity_remove_effect", "experience", "entity_attributes", "chunk", "blocks", "block", "block_action", "block_break_animation", "chunks", "explosion", "world_event", "named_sound", "particle", "game_event", "global_entity_spawn", "open_container", "close_container", "container_item", "container_items", "container_properties", "container_action", "sign_text", "map", "block_data", "sign_editor", "statistics", "tab_list", "player_abilities", "chat_suggestions", "objective", "scoreboard_score", "objective_position", "teams", "plugin", "kick", "difficulty", "combat_event", "camera", "world_border", "title", "compression", "tab_list_text", "resourcepack", "nbt_response" ] } }, @@ -1852,7 +1852,7 @@ "packets": { "c2s": ["heartbeat", "chat_message", "entity_interact", "ground_change", "position", "rotation", "position_rotation", "player_action", "block_interact", "hotbar_slot", "swing_arm", "entity_action", "steer_vehicle", "close_container", "container_click", "container_action", "item_stack_create", "container_button", "sign_text", "toggle_fly", "chat_suggestions", "settings", "client_action", "plugin", "entity_spectate", "resourcepack"], "s2c": [ - "heartbeat", "initialize", "chat_message", "time", "entity_equipment", "compass_position", "health", "respawn", "position_rotation", "hotbar_slot", "entity_sleep", "entity_animation", "entity_player", "entity_collect", "entity_object_spawn", "entity_mob_spawn", "entity_painting", "entity_experience_orb", "velocity", "entity_destroy", "empty_move", "relative_move", "rotation", "movement_rotation", "teleport", "head_rotation", "entity_status", "entity_attach", "entity_data", "entity_effect", "entity_remove_effect", "experience", "entity_attributes", "chunk", "blocks", "block", "block_action", "block_break_animation", "chunks", "explosion", "world_event", "named_sound", "particle", "game_event", "global_entity_spawn", "open_container", "close_container", "container_item", "container_items", "container_properties", "container_action", "sign_text", "map", "block_data", "sign_editor", "statistics", "tab_list", "player_abilities", "chat_suggestions", "objective", "scoreboard_score", "objective_position", "teams", "plugin", "kick", "difficulty", "combat_event", "camera", "world_border", "title", "compression_threshold", "tab_list_text", "resourcepack" + "heartbeat", "initialize", "chat_message", "time", "entity_equipment", "compass_position", "health", "respawn", "position_rotation", "hotbar_slot", "entity_sleep", "entity_animation", "entity_player", "entity_collect", "entity_object_spawn", "entity_mob_spawn", "entity_painting", "entity_experience_orb", "velocity", "entity_destroy", "empty_move", "relative_move", "rotation", "movement_rotation", "teleport", "head_rotation", "entity_status", "entity_attach", "entity_data", "entity_effect", "entity_remove_effect", "experience", "entity_attributes", "chunk", "blocks", "block", "block_action", "block_break_animation", "chunks", "explosion", "world_event", "named_sound", "particle", "game_event", "global_entity_spawn", "open_container", "close_container", "container_item", "container_items", "container_properties", "container_action", "sign_text", "map", "block_data", "sign_editor", "statistics", "tab_list", "player_abilities", "chat_suggestions", "objective", "scoreboard_score", "objective_position", "teams", "plugin", "kick", "difficulty", "combat_event", "camera", "world_border", "title", "compression", "tab_list_text", "resourcepack" ] } }, @@ -1873,7 +1873,7 @@ "packets": { "c2s": ["heartbeat", "chat_message", "entity_interact", "ground_change", "position", "rotation", "position_rotation", "player_action", "block_interact", "hotbar_slot", "swing_arm", "entity_action", "steer_vehicle", "close_container", "container_click", "container_action", "item_stack_create", "container_button", "sign_text", "toggle_fly", "chat_suggestions", "settings", "client_action", "plugin", "entity_spectate"], "s2c": [ - "heartbeat", "initialize", "chat_message", "time", "entity_equipment", "compass_position", "health", "respawn", "position_rotation", "hotbar_slot", "entity_sleep", "entity_animation", "entity_player", "entity_collect", "entity_object_spawn", "entity_mob_spawn", "entity_painting", "entity_experience_orb", "velocity", "entity_destroy", "empty_move", "relative_move", "rotation", "movement_rotation", "teleport", "head_rotation", "entity_status", "entity_attach", "entity_data", "entity_effect", "entity_remove_effect", "experience", "entity_attributes", "chunk", "blocks", "block", "block_action", "block_break_animation", "chunks", "explosion", "world_event", "named_sound", "particle", "game_event", "global_entity_spawn", "open_container", "close_container", "container_item", "container_items", "container_properties", "container_action", "sign_text", "map", "block_data", "sign_editor", "statistics", "tab_list", "player_abilities", "chat_suggestions", "objective", "scoreboard_score", "objective_position", "teams", "plugin", "kick", "difficulty", "combat_event", "camera", "world_border", "title", "compression_threshold", "tab_list_text" + "heartbeat", "initialize", "chat_message", "time", "entity_equipment", "compass_position", "health", "respawn", "position_rotation", "hotbar_slot", "entity_sleep", "entity_animation", "entity_player", "entity_collect", "entity_object_spawn", "entity_mob_spawn", "entity_painting", "entity_experience_orb", "velocity", "entity_destroy", "empty_move", "relative_move", "rotation", "movement_rotation", "teleport", "head_rotation", "entity_status", "entity_attach", "entity_data", "entity_effect", "entity_remove_effect", "experience", "entity_attributes", "chunk", "blocks", "block", "block_action", "block_break_animation", "chunks", "explosion", "world_event", "named_sound", "particle", "game_event", "global_entity_spawn", "open_container", "close_container", "container_item", "container_items", "container_properties", "container_action", "sign_text", "map", "block_data", "sign_editor", "statistics", "tab_list", "player_abilities", "chat_suggestions", "objective", "scoreboard_score", "objective_position", "teams", "plugin", "kick", "difficulty", "combat_event", "camera", "world_border", "title", "compression", "tab_list_text" ] } }, @@ -1882,7 +1882,7 @@ "packets": { "c2s": ["heartbeat", "chat_message", "entity_interact", "ground_change", "position", "rotation", "position_rotation", "player_action", "block_interact", "hotbar_slot", "swing_arm", "entity_action", "steer_vehicle", "close_container", "container_click", "container_action", "item_stack_create", "container_button", "sign_text", "toggle_fly", "chat_suggestions", "settings", "client_action", "plugin", "entity_spectate"], "s2c": [ - "heartbeat", "initialize", "chat_message", "time", "entity_equipment", "compass_position", "health", "respawn", "position_rotation", "hotbar_slot", "entity_sleep", "entity_animation", "entity_player", "entity_collect", "entity_object_spawn", "entity_mob_spawn", "entity_painting", "entity_experience_orb", "velocity", "entity_destroy", "empty_move", "relative_move", "rotation", "movement_rotation", "teleport", "head_rotation", "entity_status", "entity_attach", "entity_data", "entity_effect", "entity_remove_effect", "experience", "entity_attributes", "chunk", "blocks", "block", "block_action", "block_break_animation", "chunks", "explosion", "world_event", "named_sound", "particle", "game_event", "global_entity_spawn", "open_container", "close_container", "container_item", "container_items", "container_properties", "container_action", "sign_text", "map", "block_data", "sign_editor", "statistics", "tab_list", "player_abilities", "chat_suggestions", "objective", "scoreboard_score", "objective_position", "teams", "plugin", "kick", "difficulty", "combat_event", "camera", "world_border", "title", "compression_threshold" + "heartbeat", "initialize", "chat_message", "time", "entity_equipment", "compass_position", "health", "respawn", "position_rotation", "hotbar_slot", "entity_sleep", "entity_animation", "entity_player", "entity_collect", "entity_object_spawn", "entity_mob_spawn", "entity_painting", "entity_experience_orb", "velocity", "entity_destroy", "empty_move", "relative_move", "rotation", "movement_rotation", "teleport", "head_rotation", "entity_status", "entity_attach", "entity_data", "entity_effect", "entity_remove_effect", "experience", "entity_attributes", "chunk", "blocks", "block", "block_action", "block_break_animation", "chunks", "explosion", "world_event", "named_sound", "particle", "game_event", "global_entity_spawn", "open_container", "close_container", "container_item", "container_items", "container_properties", "container_action", "sign_text", "map", "block_data", "sign_editor", "statistics", "tab_list", "player_abilities", "chat_suggestions", "objective", "scoreboard_score", "objective_position", "teams", "plugin", "kick", "difficulty", "combat_event", "camera", "world_border", "title", "compression" ] } },