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" ]