diff --git a/src/main/java/de/bixilon/minosoft/data/player/LocalPlayerEntity.kt b/src/main/java/de/bixilon/minosoft/data/player/LocalPlayerEntity.kt
index 20c5d31c4..ac3443828 100644
--- a/src/main/java/de/bixilon/minosoft/data/player/LocalPlayerEntity.kt
+++ b/src/main/java/de/bixilon/minosoft/data/player/LocalPlayerEntity.kt
@@ -53,10 +53,7 @@ import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.EMPTY
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3iUtil.EMPTY
import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection
import de.bixilon.minosoft.protocol.packets.c2s.play.entity.EntityActionC2SP
-import de.bixilon.minosoft.protocol.packets.c2s.play.move.PositionC2SP
-import de.bixilon.minosoft.protocol.packets.c2s.play.move.PositionRotationC2SP
-import de.bixilon.minosoft.protocol.packets.c2s.play.move.RotationC2SP
-import de.bixilon.minosoft.protocol.packets.c2s.play.move.ToggleFlyC2SP
+import de.bixilon.minosoft.protocol.packets.c2s.play.move.*
import de.bixilon.minosoft.protocol.packets.s2c.play.TagsS2CP
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.util.KUtil.toResourceLocation
@@ -258,8 +255,7 @@ class LocalPlayerEntity(
} else if (rotationChanged) {
RotationC2SP(rotation, onGround)
} else if (onGround != lastOnGround) {
- // send PLAY_PLAYER_GROUND_CHANGE
- RotationC2SP(rotation, onGround)
+ GroundChangeC2SP(onGround)
} else {
null
}
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/ItemPickInteractionHandler.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/ItemPickInteractionHandler.kt
index 0a1b9c9dc..59b5c7473 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/ItemPickInteractionHandler.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/ItemPickInteractionHandler.kt
@@ -91,6 +91,8 @@ class ItemPickInteractionHandler(
rateLimiter += { connection.sendPacket(ItemStackCreateC2SP(selectedSlot, itemStack)) }
connection.player.inventory[selectedSlot] = itemStack
+
+ // ToDo: Use ItemPickC2SP
}
fun draw(delta: Double) {
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/ItemPickC2SP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/ItemPickC2SP.kt
new file mode 100644
index 000000000..c1e920bcf
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/ItemPickC2SP.kt
@@ -0,0 +1,34 @@
+/*
+ * 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.c2s
+
+import de.bixilon.minosoft.protocol.packets.factory.LoadPacket
+import de.bixilon.minosoft.protocol.protocol.PlayOutByteBuffer
+import de.bixilon.minosoft.util.logging.Log
+import de.bixilon.minosoft.util.logging.LogLevels
+import de.bixilon.minosoft.util.logging.LogMessageType
+
+@LoadPacket
+class ItemPickC2SP(
+ val slot: Int,
+) : PlayC2SPacket {
+
+ override fun write(buffer: PlayOutByteBuffer) {
+ buffer.writeVarInt(slot)
+ }
+
+ override fun log(reducedLog: Boolean) {
+ Log.log(LogMessageType.NETWORK_PACKETS_OUT, LogLevels.VERBOSE) { "Pick item (slot=$slot)" }
+ }
+}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/BookC2SP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/BookC2SP.kt
new file mode 100644
index 000000000..173865599
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/BookC2SP.kt
@@ -0,0 +1,46 @@
+/*
+ * 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.c2s.play
+
+import de.bixilon.minosoft.data.player.Hands
+import de.bixilon.minosoft.protocol.packets.c2s.PlayC2SPacket
+import de.bixilon.minosoft.protocol.packets.factory.LoadPacket
+import de.bixilon.minosoft.protocol.protocol.PlayOutByteBuffer
+import de.bixilon.minosoft.util.logging.Log
+import de.bixilon.minosoft.util.logging.LogLevels
+import de.bixilon.minosoft.util.logging.LogMessageType
+
+@LoadPacket
+class BookC2SP(
+ val hand: Hands,
+ val pages: Array,
+ val title: String?,
+) : PlayC2SPacket {
+
+ override fun write(buffer: PlayOutByteBuffer) {
+ buffer.writeVarInt(hand.ordinal)
+ buffer.writeVarInt(pages.size)
+ for (page in pages) {
+ buffer.writeString(page)
+ }
+ buffer.writeBoolean(title != null)
+ if (title != null) {
+ buffer.writeString(title)
+ }
+ }
+
+ override fun log(reducedLog: Boolean) {
+ Log.log(LogMessageType.NETWORK_PACKETS_OUT, LogLevels.VERBOSE) { "Book (hand=$hand, pages=$pages, title=$title)" }
+ }
+}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/block/BlockNbtC2SP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/block/BlockNbtC2SP.kt
new file mode 100644
index 000000000..2e40291c0
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/block/BlockNbtC2SP.kt
@@ -0,0 +1,38 @@
+/*
+ * 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.c2s.play.block
+
+import de.bixilon.minosoft.protocol.packets.c2s.PlayC2SPacket
+import de.bixilon.minosoft.protocol.packets.factory.LoadPacket
+import de.bixilon.minosoft.protocol.protocol.PlayOutByteBuffer
+import de.bixilon.minosoft.util.logging.Log
+import de.bixilon.minosoft.util.logging.LogLevels
+import de.bixilon.minosoft.util.logging.LogMessageType
+import glm_.vec3.Vec3i
+
+@LoadPacket
+class BlockNbtC2SP(
+ val transactionId: Int,
+ val blockPosition: Vec3i,
+) : PlayC2SPacket {
+
+ override fun write(buffer: PlayOutByteBuffer) {
+ buffer.writeVarInt(transactionId)
+ buffer.writePosition(blockPosition)
+ }
+
+ override fun log(reducedLog: Boolean) {
+ Log.log(LogMessageType.NETWORK_PACKETS_OUT, LogLevels.VERBOSE) { "Block nbt (transactionId=$transactionId, blockPosition=$blockPosition)" }
+ }
+}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/difficulty/DifficultyC2SP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/difficulty/DifficultyC2SP.kt
new file mode 100644
index 000000000..531e088a9
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/difficulty/DifficultyC2SP.kt
@@ -0,0 +1,36 @@
+/*
+ * 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.c2s.play.difficulty
+
+import de.bixilon.minosoft.data.Difficulties
+import de.bixilon.minosoft.protocol.packets.c2s.PlayC2SPacket
+import de.bixilon.minosoft.protocol.packets.factory.LoadPacket
+import de.bixilon.minosoft.protocol.protocol.PlayOutByteBuffer
+import de.bixilon.minosoft.util.logging.Log
+import de.bixilon.minosoft.util.logging.LogLevels
+import de.bixilon.minosoft.util.logging.LogMessageType
+
+@LoadPacket
+class DifficultyC2SP(
+ val difficulty: Difficulties,
+) : PlayC2SPacket {
+
+ override fun write(buffer: PlayOutByteBuffer) {
+ buffer.writeByte(difficulty.ordinal)
+ }
+
+ override fun log(reducedLog: Boolean) {
+ Log.log(LogMessageType.NETWORK_PACKETS_OUT, LogLevels.VERBOSE) { "Difficulty (difficulty=$difficulty)" }
+ }
+}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/difficulty/LockDifficultyC2SP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/difficulty/LockDifficultyC2SP.kt
new file mode 100644
index 000000000..1e06eaf90
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/difficulty/LockDifficultyC2SP.kt
@@ -0,0 +1,35 @@
+/*
+ * 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.c2s.play.difficulty
+
+import de.bixilon.minosoft.protocol.packets.c2s.PlayC2SPacket
+import de.bixilon.minosoft.protocol.packets.factory.LoadPacket
+import de.bixilon.minosoft.protocol.protocol.PlayOutByteBuffer
+import de.bixilon.minosoft.util.logging.Log
+import de.bixilon.minosoft.util.logging.LogLevels
+import de.bixilon.minosoft.util.logging.LogMessageType
+
+@LoadPacket
+class LockDifficultyC2SP(
+ val lock: Boolean,
+) : PlayC2SPacket {
+
+ override fun write(buffer: PlayOutByteBuffer) {
+ buffer.writeBoolean(lock)
+ }
+
+ override fun log(reducedLog: Boolean) {
+ Log.log(LogMessageType.NETWORK_PACKETS_OUT, LogLevels.VERBOSE) { "Lock difficulty (lock=$lock)" }
+ }
+}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/move/GroundChangeC2SP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/move/GroundChangeC2SP.kt
new file mode 100644
index 000000000..89b52f32b
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/move/GroundChangeC2SP.kt
@@ -0,0 +1,37 @@
+/*
+ * 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.c2s.play.move
+
+import de.bixilon.minosoft.protocol.packets.c2s.PlayC2SPacket
+import de.bixilon.minosoft.protocol.packets.factory.LoadPacket
+import de.bixilon.minosoft.protocol.protocol.PlayOutByteBuffer
+import de.bixilon.minosoft.util.logging.Log
+import de.bixilon.minosoft.util.logging.LogLevels
+import de.bixilon.minosoft.util.logging.LogMessageType
+
+@LoadPacket
+class GroundChangeC2SP(
+ val onGround: Boolean,
+) : PlayC2SPacket {
+
+ override fun write(buffer: PlayOutByteBuffer) {
+ buffer.writeBoolean(onGround)
+ }
+
+ override fun log(reducedLog: Boolean) {
+ if (reducedLog) {
+ return
+ }
+ Log.log(LogMessageType.NETWORK_PACKETS_OUT, LogLevels.VERBOSE) { "Ground change (onGround=$onGround))" }
+ }
+}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/move/PositionC2SP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/move/PositionC2SP.kt
index 7bb777908..94f98ed51 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/move/PositionC2SP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/move/PositionC2SP.kt
@@ -38,6 +38,9 @@ class PositionC2SP(
}
override fun log(reducedLog: Boolean) {
+ if (reducedLog) {
+ return
+ }
Log.log(LogMessageType.NETWORK_PACKETS_OUT, LogLevels.VERBOSE) { "Position (position=$position, onGround=$onGround)" }
}
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/move/PositionRotationC2SP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/move/PositionRotationC2SP.kt
index f53ebba2a..c3e045029 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/move/PositionRotationC2SP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/move/PositionRotationC2SP.kt
@@ -42,6 +42,9 @@ class PositionRotationC2SP(
}
override fun log(reducedLog: Boolean) {
+ if (reducedLog) {
+ return
+ }
Log.log(LogMessageType.NETWORK_PACKETS_OUT, LogLevels.VERBOSE) { "Position + rotation (position=$position, rotation=$rotation, onGround=$onGround)" }
}
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/move/RotationC2SP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/move/RotationC2SP.kt
index a091c16de..48b58921a 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/move/RotationC2SP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/move/RotationC2SP.kt
@@ -33,6 +33,9 @@ class RotationC2SP(
}
override fun log(reducedLog: Boolean) {
+ if (reducedLog) {
+ return
+ }
Log.log(LogMessageType.NETWORK_PACKETS_OUT, LogLevels.VERBOSE) { "Rotation (rotation=$rotation, onGround=$onGround)" }
}
}
diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/move/SwingArmC2SP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/move/SwingArmC2SP.kt
index 99c8bbcc8..e8eef0ff0 100644
--- a/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/move/SwingArmC2SP.kt
+++ b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/move/SwingArmC2SP.kt
@@ -33,6 +33,9 @@ class SwingArmC2SP(
}
override fun log(reducedLog: Boolean) {
+ if (reducedLog) {
+ return
+ }
Log.log(LogMessageType.NETWORK_PACKETS_OUT, LogLevels.VERBOSE) { "Swing arm (arm=$arm)" }
}
}
diff --git a/src/main/resources/assets/minosoft/mapping/versions.json b/src/main/resources/assets/minosoft/mapping/versions.json
index 92d581711..309e2000d 100644
--- a/src/main/resources/assets/minosoft/mapping/versions.json
+++ b/src/main/resources/assets/minosoft/mapping/versions.json
@@ -109,7 +109,7 @@
"name": "21w40a",
"protocol_id": 1073741868,
"packets": {
- "c2s": ["confirm_teleport", "block_nbt", "difficulty", "chat_message", "client_action", "settings", "chat_suggestions", "container_button", "container_click", "close_container", "plugin", "book", "entity_nbt", "entity_interact", "generate_structure", "heartbeat", "lock_difficulty", "position", "position_rotation", "rotation", "ground_change", "move_vehicle", "steer_boat", "item_pick", "crafting_recipe", "toggle_fly", "player_action", "entity_action", "steer_vehicle", "pong", "displayed_recipe", "recipe_book", "anvil_item_name", "resourcepack", "advancement_tab", "trade", "beacon_effect", "hotbar_slot", "command_block", "minecart_command_block", "item_stack_cte", "jigsaw_block", "structure_block", "sign_text", "swing_arm", "entity_spectate", "block_interact", "use_item"],
+ "c2s": ["confirm_teleport", "block_nbt", "difficulty", "chat_message", "client_action", "settings", "chat_suggestions", "container_button", "container_click", "close_container", "plugin", "book", "entity_nbt", "entity_interact", "generate_structure", "heartbeat", "lock_difficulty", "position", "position_rotation", "rotation", "ground_change", "move_vehicle", "steer_boat", "item_pick", "crafting_recipe", "toggle_fly", "player_action", "entity_action", "steer_vehicle", "pong", "displayed_recipe", "recipe_book", "anvil_item_name", "resourcepack", "advancement_tab", "trade", "beacon_effect", "hotbar_slot", "command_block", "minecart_command_block", "item_stack_create", "jigsaw_block", "structure_block", "sign_text", "swing_arm", "entity_spectate", "block_interact", "use_item"],
"s2c": [
"entity_object_spawn", "entity_experience_orb", "entity_mob_spawn", "entity_painting", "entity_player", "vibration", "entity_animation", "statistics", "block_break", "block_break_animation", "block_data", "block_action", "block", "bossbar", "difficulty", "chat_message", "clear_title", "chat_suggestions", "commands", "close_container", "container_items", "container_properties", "container_item", "item_cooldown", "plugin", "named_sound", "kick", "entity_status", "explosion", "unload_chunk", "game_event", "open_horse_container", "initialize_world_border", "heartbeat", "chunk", "world_event", "particle", "chunk_light", "initialize", "map", "villager_trades", "relative_move", "movement_rotation", "rotation", "move_vehicle", "book", "open_container", "sign_editor", "ping", "crafting_recipe", "player_abilities", "end_combat_event", "enter_combat_event", "kill_combat_event", "tab_list", "player_face", "position_rotation", "unlock_recipes", "entity_destroy", "entity_remove_effect", "resourcepack", "respawn", "head_rotation", "blocks", "advancement_tab", "hotbar_text", "center_world_border", "lerp_world_border", "size_world_border", "warn_time_world_border", "warn_blocks_world_border", "camera", "hotbar_slot", "chunk_center", "view_distance", "compass_position", "objective_position", "entity_data", "entity_attach", "velocity", "entity_equipment", "experience", "health", "objective", "entity_passenger", "teams", "scoreboard_score", "simulation_distance", "subtitle", "time", "title_text", "title_times", "entity_sound", "sound_event", "stop_sound", "tab_list_text", "nbt_response", "entity_collect", "teleport", "advancements", "entity_attributes", "entity_effect", "recipes", "tags"
]
@@ -211,7 +211,7 @@
"name": "21w19a",
"protocol_id": 1073741851,
"packets": {
- "c2s": ["confirm_teleport", "block_nbt", "difficulty", "chat_message", "client_action", "settings", "chat_suggestions", "container_button", "container_click", "close_container", "plugin", "book", "entity_nbt", "entity_interact", "generate_structure", "heartbeat", "lock_difficulty", "position", "position_rotation", "rotation", "ground_change", "move_vehicle", "steer_boat", "item_pick", "crafting_recipe", "toggle_fly", "player_action", "entity_action", "steer_vehicle", "pong", "displayed_recipe", "recipe_book", "anvil_item_name", "resourcepack", "advancement_tab", "trade", "beacon_effect", "hotbar_slot", "command_block", "minecart_command_block", "item_stack_cte", "jigsaw_block", "structure_block", "sign_text", "swing_arm", "entity_spectate", "block_interact", "use_item"],
+ "c2s": ["confirm_teleport", "block_nbt", "difficulty", "chat_message", "client_action", "settings", "chat_suggestions", "container_button", "container_click", "close_container", "plugin", "book", "entity_nbt", "entity_interact", "generate_structure", "heartbeat", "lock_difficulty", "position", "position_rotation", "rotation", "ground_change", "move_vehicle", "steer_boat", "item_pick", "crafting_recipe", "toggle_fly", "player_action", "entity_action", "steer_vehicle", "pong", "displayed_recipe", "recipe_book", "anvil_item_name", "resourcepack", "advancement_tab", "trade", "beacon_effect", "hotbar_slot", "command_block", "minecart_command_block", "item_stack_create", "jigsaw_block", "structure_block", "sign_text", "swing_arm", "entity_spectate", "block_interact", "use_item"],
"s2c": [
"entity_object_spawn", "entity_experience_orb", "entity_mob_spawn", "entity_painting", "entity_player", "vibration", "entity_animation", "statistics", "block_break", "block_break_animation", "block_data", "block_action", "block", "bossbar", "difficulty", "chat_message", "clear_title", "chat_suggestions", "commands", "close_container", "container_items", "container_properties", "container_item", "item_cooldown", "plugin", "named_sound", "kick", "entity_status", "explosion", "unload_chunk", "game_event", "open_horse_container", "initialize_world_border", "heartbeat", "chunk", "world_event", "particle", "chunk_light", "initialize", "map", "villager_trades", "relative_move", "movement_rotation", "rotation", "move_vehicle", "book", "open_container", "sign_editor", "ping", "crafting_recipe", "player_abilities", "end_combat_event", "enter_combat_event", "kill_combat_event", "tab_list", "player_face", "position_rotation", "unlock_recipes", "entity_destroy", "entity_remove_effect", "resourcepack", "respawn", "head_rotation", "blocks", "advancement_tab", "hotbar_text", "center_world_border", "lerp_world_border", "size_world_border", "warn_time_world_border", "warn_blocks_world_border", "camera", "hotbar_slot", "chunk_center", "view_distance", "compass_position", "objective_position", "entity_data", "entity_attach", "velocity", "entity_equipment", "experience", "health", "objective", "entity_passenger", "teams", "scoreboard_score", "subtitle", "time", "title_text", "title_times", "entity_sound", "sound_event", "stop_sound", "tab_list_text", "nbt_response", "entity_collect", "teleport", "advancements", "entity_attributes", "entity_effect", "recipes", "tags"
]