diff --git a/.clang-format b/.clang-format index 4407457..ce02044 100644 --- a/.clang-format +++ b/.clang-format @@ -2,16 +2,17 @@ BasedOnStyle: LLVM IndentWidth: 4 # logical indent level = 1 tab TabWidth: 4 # how wide a tab renders (adjust per team preference) -UseTab: ForIndentation # use tabs for indentation, spaces for alignment +UseTab: Always # use tabs for indentation, spaces for alignment ContinuationIndentWidth: 8 BreakBeforeBraces: Attach -ColumnLimit: 100 +ColumnLimit: 150 AllowShortIfStatementsOnASingleLine: true AllowShortFunctionsOnASingleLine: true PointerAlignment: Left SpaceBeforeParens: ControlStatements -AlignConsecutiveAssignments: Consecutive -AlignConsecutiveDeclarations: None +AlignConsecutiveAssignments: true +AlignConsecutiveDeclarations: true +AlignConsecutiveMacros: true BinPackArguments: false BinPackParameters: false Cpp11BracedListStyle: true diff --git a/.clangd b/.clangd index e308436..b9e3cdd 100644 --- a/.clangd +++ b/.clangd @@ -1,6 +1,6 @@ CompileFlags: Add: - - "-std=c++17" + - "-std=c++23" - "-Wall" - "-Wextra" - "-Wpedantic" diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml new file mode 100644 index 0000000..81fa678 --- /dev/null +++ b/.github/workflows/format.yml @@ -0,0 +1,43 @@ +# name: clang-format + +# on: +# push: +# pull_request: + +# jobs: +# clang-format: +# runs-on: ubuntu-latest +# permissions: +# contents: write + +# steps: +# - name: Checkout code +# uses: actions/checkout@v4 +# with: +# ref: ${{ github.head_ref || github.ref_name }} +# token: ${{ secrets.GITHUB_TOKEN }} + +# - name: Install clang-format +# run: | +# sudo apt-get update +# sudo apt-get install -y clang-format + +# - name: Run clang-format +# run: | +# find . -name '*.cpp' -o -name '*.h' -o -name '*.c' -o -name '*.hpp' -o -name '*.cc' -o -name '*.cxx' \ +# | grep -v "include/lib/json.hpp" \ +# | xargs clang-format -i --style=file + +# - name: Commit and push changes +# run: | +# git config --local user.email "github-actions[bot]@users.noreply.github.com" +# git config --local user.name "github-actions[bot]" + +# if ! git diff --quiet; then +# git add -A +# git commit -m "Apply clang-format [skip ci]" +# git push +# echo "Code formatted and pushed" +# else +# echo "No formatting changes needed" +# fi diff --git a/.github/workflows/verif-build.yml b/.github/workflows/verif-build.yml deleted file mode 100644 index d21eb7c..0000000 --- a/.github/workflows/verif-build.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: C/C++ CI - -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - name: make - run: make diff --git a/.gitignore b/.gitignore index a92ec07..43b65ec 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,7 @@ compile_commands.json .cache .vscode logs + +# Test server directory +test-server +include/external diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..bf7ea90 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "external/data-generator"] + path = external/data-generator + url = https://github.com/Random-stuff-unlimited/data-generator.git diff --git a/.rules b/.rules new file mode 100644 index 0000000..90d2ff8 --- /dev/null +++ b/.rules @@ -0,0 +1,5 @@ +1. Do not create markdown documentation. +2. When creating code from scratch you should always make sure the code does work before reitering. +3. When working on complex feature you always should ask for direction on data type the user might need. +4. If you think a library header is needed to go futher stop and ask user. You can recommand a library. +5. If not asked do not modify any code in any way. diff --git a/Makefile b/Makefile index af546ad..17f61c3 100644 --- a/Makefile +++ b/Makefile @@ -18,11 +18,11 @@ CXX := g++ CXXFLAGS := -std=c++20 -Wall -Wextra -Wpedantic -O2 DEBUG_FLAGS := -g -DDEBUG -O0 RELEASE_FLAGS := -DNDEBUG -O3 -INCLUDE_FLAGS := -I$(INCLUDE_DIR) +INCLUDE_FLAGS := -I$(INCLUDE_DIR) -I$(INCLUDE_DIR)/data -I$(INCLUDE_DIR)/network -I$(INCLUDE_DIR)/world -I$(INCLUDE_DIR)/lib # Linker flags (add your libraries here) LDFLAGS := -LIBS := +LIBS := -lz # ================================ COLOR SETUP =============================== # ANSI color codes for beautiful output @@ -82,7 +82,7 @@ else endif # ================================= TARGETS ================================== -.PHONY: all clean debug release info help run install uninstall compile_commands +.PHONY: all clean distclean clean-test debug release info help run install uninstall compile_commands # Default target all: info $(TARGET) @@ -129,14 +129,44 @@ $(DEPS_DIR): # Clean build artifacts clean: @printf "$(BOLD)$(BRIGHT_RED)🧹 Cleaning build artifacts...$(RESET)\n" + @find $(BUILD_DIR) -type f -name "*.o" -delete 2>/dev/null || true + @find $(BUILD_DIR) -name "$(TARGET_NAME)" -delete 2>/dev/null || true + @find $(BUILD_DIR) -type d -empty -delete 2>/dev/null || true + @find $(DEPS_DIR) -type f -name "*.d" -delete 2>/dev/null || true + @find $(DEPS_DIR) -type d -empty -delete 2>/dev/null || true + @printf "$(BOLD)$(BRIGHT_GREEN)✨ Clean completed! (Preserved directories and config.json)$(RESET)\n" + +# Complete clean - removes everything including directories +distclean: + @printf "$(BOLD)$(BRIGHT_RED)🧹 Complete cleanup (removing all build artifacts and directories)...$(RESET)\n" @rm -rf $(BUILD_DIR) $(DEPS_DIR) - @printf "$(BOLD)$(BRIGHT_GREEN)✨ Clean completed!$(RESET)\n" + @printf "$(BOLD)$(BRIGHT_GREEN)✨ Complete cleanup finished!$(RESET)\n" + +# Clean test-server directory +clean-test: + @printf "$(BOLD)$(BRIGHT_RED)🧹 Cleaning test-server directory...$(RESET)\n" + @rm -rf test-server + @printf "$(BOLD)$(BRIGHT_GREEN)✨ Test-server cleanup finished!$(RESET)\n" # Run the executable run: $(TARGET) + @printf "$(BOLD)$(BRIGHT_MAGENTA)πŸš€ Setting up test-server environment...$(RESET)\n" + @mkdir -p test-server + @printf "$(BOLD)$(BRIGHT_BLUE)πŸ“¦ Copying executable to test-server...$(RESET)\n" + @cp $(TARGET) test-server/$(TARGET_NAME) + @printf "$(BOLD)$(BRIGHT_BLUE)πŸ“¦ Copying config.json to test-server...$(RESET)\n" + @cp -f config.json test-server/ 2>/dev/null || printf "$(YELLOW)⚠️ config.json not found, skipping...$(RESET)\n" + @printf "$(BOLD)$(BRIGHT_BLUE)πŸ“¦ Copying world folder to test-server...$(RESET)\n" + @if [ -d "world" ]; then \ + cp -r world test-server/; \ + printf "$(BOLD)$(BRIGHT_GREEN)βœ… World folder copied successfully!$(RESET)\n"; \ + else \ + printf "$(YELLOW)⚠️ World folder not found, skipping...$(RESET)\n"; \ + fi + @printf "$(BOLD)$(BRIGHT_GREEN)βœ… Test environment ready!$(RESET)\n" @printf "$(BOLD)$(BRIGHT_MAGENTA)πŸš€ Running $(TARGET_NAME)...$(RESET)\n" @printf "$(DIM)$(WHITE)" && echo "================================================" && printf "$(RESET)" - @./$(TARGET) + @cd test-server && ./$(TARGET_NAME) @printf "$(DIM)$(WHITE)" && echo "================================================" && printf "$(RESET)" # Display project information @@ -190,8 +220,10 @@ help: @printf "$(BOLD)$(BRIGHT_CYAN)β•‘$(RESET) $(BRIGHT_GREEN)%-10s$(RESET) %-39s $(BOLD)$(BRIGHT_CYAN) β•‘$(RESET)\n" "all" "Build the project (default: release mode)" @printf "$(BOLD)$(BRIGHT_CYAN)β•‘$(RESET) $(BRIGHT_GREEN)%-10s$(RESET) %-39s $(BOLD)$(BRIGHT_CYAN) β•‘$(RESET)\n" "debug" "Build in debug mode" @printf "$(BOLD)$(BRIGHT_CYAN)β•‘$(RESET) $(BRIGHT_GREEN)%-10s$(RESET) %-39s $(BOLD)$(BRIGHT_CYAN) β•‘$(RESET)\n" "release" "Build in release mode" - @printf "$(BOLD)$(BRIGHT_CYAN)β•‘$(RESET) $(BRIGHT_GREEN)%-10s$(RESET) %-39s $(BOLD)$(BRIGHT_CYAN) β•‘$(RESET)\n" "clean" "Remove all build artifacts" - @printf "$(BOLD)$(BRIGHT_CYAN)β•‘$(RESET) $(BRIGHT_GREEN)%-10s$(RESET) %-39s $(BOLD)$(BRIGHT_CYAN) β•‘$(RESET)\n" "run" "Build and run the executable" + @printf "$(BOLD)$(BRIGHT_CYAN)β•‘$(RESET) $(BRIGHT_GREEN)%-10s$(RESET) %-39s $(BOLD)$(BRIGHT_CYAN) β•‘$(RESET)\n" "clean" "Remove build artifacts (preserve dirs)" + @printf "$(BOLD)$(BRIGHT_CYAN)β•‘$(RESET) $(BRIGHT_GREEN)%-10s$(RESET) %-39s $(BOLD)$(BRIGHT_CYAN) β•‘$(RESET)\n" "distclean" "Remove all build artifacts and dirs" + @printf "$(BOLD)$(BRIGHT_CYAN)β•‘$(RESET) $(BRIGHT_GREEN)%-10s$(RESET) %-39s $(BOLD)$(BRIGHT_CYAN) β•‘$(RESET)\n" "clean-test" "Remove test-server directory" + @printf "$(BOLD)$(BRIGHT_CYAN)β•‘$(RESET) $(BRIGHT_GREEN)%-10s$(RESET) %-39s $(BOLD)$(BRIGHT_CYAN) β•‘$(RESET)\n" "run" "Setup test-server and run executable" @printf "$(BOLD)$(BRIGHT_CYAN)β•‘$(RESET) $(BRIGHT_GREEN)%-10s$(RESET) %-39s $(BOLD)$(BRIGHT_CYAN) β•‘$(RESET)\n" "compile_commands" "Generate compile_commands.json for LSP" @printf "$(BOLD)$(BRIGHT_CYAN)β•‘$(RESET) $(BRIGHT_GREEN)%-10s$(RESET) %-39s $(BOLD)$(BRIGHT_CYAN) β•‘$(RESET)\n" "install" "Install the executable to system" @printf "$(BOLD)$(BRIGHT_CYAN)β•‘$(RESET) $(BRIGHT_GREEN)%-10s$(RESET) %-39s $(BOLD)$(BRIGHT_CYAN) β•‘$(RESET)\n" "uninstall" "Remove the executable from system" diff --git a/config.json b/config.json index 27204e7..6e2b30b 100644 --- a/config.json +++ b/config.json @@ -1,12 +1,17 @@ { - "version": { - "name": "1.21.5", - "protocol": 770 - }, - "server": { - "ip-address": "127.0.0.1", - "port": 25565, - "motd": "Β§aServeur Minecraft en C!", - "max-players": 20 - } + "version": { + "name": "1.21.5", + "protocol": 770 + }, + "server": { + "ip-address": "127.0.0.1", + "port": 25565, + "motd": "Β§aServeur Minecraft en C!", + "max-players": 20 + }, + "world": { + "name": "world", + "gamemode": "survival", + "difficulty": "normal" + } } diff --git a/external/data-generator b/external/data-generator new file mode 160000 index 0000000..45d7644 --- /dev/null +++ b/external/data-generator @@ -0,0 +1 @@ +Subproject commit 45d7644b5a6270ef2c3b99a4b360a9cdcfca66e5 diff --git a/ideas/console-log.md b/ideas/console-log.md deleted file mode 100644 index 03b823d..0000000 --- a/ideas/console-log.md +++ /dev/null @@ -1,33 +0,0 @@ -# Console Idea - -### Console Section -- **Server Control**: Start, stop, restart server -- **Player Management**: Kick, ban, whitelist players, view player list, view player info -- **World Management**: Load, save, backup world data -- **Configuration**: Modify server settings on runtime -- **Logging section**: View and filter server logs (network, chat, game info (Filter for warning / error)) - -### Console Architecture -``` -ConsoleManager -β”œβ”€β”€ ServerControl -β”œβ”€β”€ PlayerManagement - β”œβ”€β”€ player list - β”œβ”€β”€ player info / Kick / Ban / Whitelist - β”œβ”€β”€ add player to Whitelist (if enabled) -β”œβ”€β”€ WorldManagement (soon) - β”œβ”€β”€ world list - β”œβ”€β”€ world info / Load / Save / Backup - β”œβ”€β”€ world info -β”œβ”€β”€ Configuration (soon) - β”œβ”€β”€ config list - β”œβ”€β”€ config info / Load / Save / Backup -β”œβ”€β”€ LoggingSection - β”œβ”€β”€ log network / all / chat / gameinfo - β”œβ”€β”€ filter (error / warning / info) -``` - -# Logging Idea - -1 file network (all error / warning / info) -1 file gameinfo (all error / warning / info) diff --git a/include/buffer.hpp b/include/buffer.hpp deleted file mode 100644 index 0dd7694..0000000 --- a/include/buffer.hpp +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef BUFFER_HPP -#define BUFFER_HPP - -#include "UUID.hpp" - -#include -#include -#include -#include - -class Buffer { - private: - std::vector _data; - size_t _pos; - - public: - Buffer(); - explicit Buffer(const std::vector& data); - - int readVarInt(); - void writeVarInt(int value); - void writeInt(int32_t value); - void writeIdentifierArray(const std::vector& ids); - void writeUInt(uint32_t value); - - std::string readString(int maxLength); - void writeString(const std::string& str); - - std::vector& getData(); - size_t remaining() const; - uint16_t readUShort(); - uint64_t readUInt64(); - long readLong(); - void writeLong(long value); - uint8_t readByte(); - void writeByte(uint8_t byte); - void writeBytes(const std::string& data); - void writeBytes(const std::vector& data); - void writeUUID(const UUID& uuid); - - void writeBool(bool value); - void writeNBT(const std::string& nbtData); - void writePosition(int32_t x, int32_t y, int32_t z); - void writeFloat(float value); - void writeDouble(double value); - void writeIdentifier(const std::string& id); - void writeVarLong(int64_t value); - void writeShort(int16_t value); -}; - -#endif diff --git a/include/config.hpp b/include/config.hpp new file mode 100644 index 0000000..5b022a7 --- /dev/null +++ b/include/config.hpp @@ -0,0 +1,53 @@ +#ifndef CONFIG_HPP +#define CONFIG_HPP + +#include +#include + +class Config { + private: + std::filesystem::path _execPath; + + // Version Config + std::string _gameVersion; + int _protocolVersion; + + // Server Config + std::string _serverMotd; + std::string _serverAddress; + int _serverPort; + int _serverSize; + + // World Config + std::string _worldName; + std::string _gamemode; + std::string _difficulty; + + public: + Config(); + ~Config(); + bool loadConfig(); + bool reloadConfig(); + + int getServerPort(); + int getProtocolVersion(); + int getServerSize(); + std::string getVersion(); + std::string getServerMotd(); + std::string getServerAddress(); + std::string getWorldName(); + std::string getGamemode(); + std::string getDifficulty(); + + void setProtocolVersion(int ProtoVersion); + void setServerSize(int ServerSize); + void setServerPort(int ServerPort); + void setServerMotd(std::string ServerMotd); + void setServerVersion(std::string ServerVersion); + void setServerAddress(std::string ServerAddress); + void setWorldName(std::string WorldName); + void setGamemode(std::string Gamemode); + void setDifficulty(std::string Difficulty); +}; + +#endif diff --git a/include/data/RegistriesTag.hpp b/include/data/RegistriesTag.hpp new file mode 100644 index 0000000..b0ceac2 --- /dev/null +++ b/include/data/RegistriesTag.hpp @@ -0,0 +1,728 @@ +#pragma once + +#include +#include +#include + +struct Tag { + std::string name; + std::vector entries; +}; + +const std::unordered_map> RegistriesTags = { + {"minecraft:point_of_interest_type", + {{"minecraft:bee_home", {15, 16}}, + {"minecraft:acquirable_job_site", {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}}, + {"minecraft:village", {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}}}}, + {"minecraft:block", + {{"minecraft:mob_interactable_doors", + {207, 614, 615, 616, 617, 619, 620, 858, 859, 621, 622, 618, 1008, 1009, 1011, 1010, 1012, 1013, 1015, 1014}}, + {"minecraft:campfires", {818, 819}}, + {"minecraft:soul_fire_base_blocks", {273, 274}}, + {"minecraft:infiniburn_nether", {272, 639}}, + {"minecraft:wooden_slabs", {567, 568, 569, 570, 571, 573, 574, 844, 845, 575, 576, 572}}, + {"minecraft:snaps_goat_horn", {53, 51, 49, 52, 50, 55, 56, 57, 54, 1, 524, 44, 46, 970, 367}}, + {"minecraft:coal_ores", {46, 47}}, + {"minecraft:occludes_vibration_signals", {140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155}}, + {"minecraft:pale_oak_logs", {56, 20, 67, 86}}, + {"minecraft:small_flowers", {157, 1099, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 170, 169, 158, 1100}}, + {"minecraft:azalea_root_replaceable", + {1, 2, 4, 6, 943, 1059, 9, 8, 11, 10, 342, 1057, 1052, 1096, 1058, 59, 522, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 39, 268, 40, 37, 265, 959}}, + {"minecraft:wooden_trapdoors", {305, 303, 307, 308, 304, 301, 302, 850, 851, 309, 310, 306}}, + {"minecraft:invalid_spawn_inside", {360, 635}}, + {"minecraft:dry_vegetation_may_place_on", {37, 39, 38, 522, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 9, 8, 11, 10, 342, 1057, 1052, 1096, 1058, 59, 195}}, + {"minecraft:foxes_spawnable_on", {8, 263, 265, 11, 10}}, + {"minecraft:wolves_spawnable_on", {8, 263, 265, 10, 11}}, + {"minecraft:wool", {140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155}}, + {"minecraft:stairs", {187, 373, 374, 375, 484, 486, 487, 854, 855, 488, 489, 485, 490, 210, 366, 352, 340, 339, 628, 449, + 566, 499, 498, 500, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 884, 892, + 895, 1061, 1065, 1069, 1073, 984, 985, 986, 987, 1001, 1002, 1003, 1000, 341, 945, 949, 954, 346}}, + {"minecraft:edible_for_sheep", {130, 134, 135, 131}}, + {"minecraft:logs", {55, 77, 66, 85, 56, 20, 67, 86, 49, 71, 68, 79, 53, 75, 64, 83, 51, 73, 62, 81, 52, 74, + 63, 82, 50, 72, 61, 80, 57, 78, 69, 87, 54, 76, 65, 84, 830, 831, 832, 833, 821, 822, 823, 824}}, + {"minecraft:all_signs", + {197, 198, 199, 200, 202, 203, 204, 860, 861, 205, 206, 201, 211, 212, 213, 214, 216, 217, 218, 862, 863, 219, 220, 215, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 242, 243, 241, 244}}, + {"minecraft:trail_ruins_replaceable", {40}}, + {"minecraft:beehives", {870, 871}}, + {"minecraft:ice", {264, 524, 756, 638}}, + {"minecraft:azalea_grows_on", {9, 8, 11, 10, 342, 1057, 1052, 1096, 1058, 59, 37, 39, 38, 522, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 265, 959}}, + {"minecraft:enchantment_power_provider", {177}}, + {"minecraft:wool_carpets", {506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521}}, + {"minecraft:dragon_immune", {492, 34, 360, 361, 635, 376, 636, 637, 864, 865, 156, 180, 876, 362, 326, 877, 1090, 866, 867}}, + {"minecraft:crops", {633, 409, 410, 194, 334, 333, 630, 631}}, + {"minecraft:mangrove_roots_can_grow_through", {1058, 59, 58, 1048, 335, 33, 263}}, + {"minecraft:features_cannot_replace", {34, 185, 188, 361, 1090, 1093, 1094}}, + {"minecraft:valid_spawn", {8, 11}}, + {"minecraft:mushroom_grow_block", {342, 11, 834, 825}}, + {"minecraft:wooden_doors", {207, 614, 615, 616, 617, 619, 620, 858, 859, 621, 622, 618}}, + {"minecraft:crystal_sound_blocks", {937, 938}}, + {"minecraft:sniffer_egg_hatch_boost", {1052}}, + {"minecraft:standing_signs", {197, 198, 199, 200, 202, 203, 204, 860, 861, 205, 206, 201}}, + {"minecraft:warped_stems", {821, 822, 823, 824}}, + {"minecraft:infiniburn_end", {272, 639, 34}}, + {"minecraft:emerald_ores", {367, 368}}, + {"minecraft:bamboo_blocks", {60, 70}}, + {"minecraft:crimson_stems", {830, 831, 832, 833}}, + {"minecraft:replaceable_by_trees", + {91, 88, 89, 95, 94, 92, 90, 97, 98, 96, 93, 157, 1099, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 170, 169, 158, + 1100, 1097, 130, 131, 132, 335, 336, 525, 526, 527, 528, 529, 530, 1056, 632, 35, 136, 137, 133, 1103, 828, 829, 841, 1051, 134, 135}}, + {"minecraft:needs_stone_tool", + {174, 1081, 44, 45, 104, 102, 103, 966, 1082, 970, 971, 991, 987, 975, 968, 989, 985, 973, 969, + 988, 984, 972, 967, 990, 986, 974, 992, 1007, 1003, 999, 993, 1005, 1001, 997, 994, 1006, 1002, 998, + 995, 1004, 1000, 996, 1040, 1092, 979, 978, 977, 976, 983, 982, 981, 980, 1024, 1025, 1026, 1027, 1028, + 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1016, 1017, 1019, 1018, 1020, 1021, 1023, 1022}}, + {"minecraft:concrete_powder", {694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709}}, + {"minecraft:lava_pool_stone_cannot_replace", + {34, 185, 188, 361, 1090, 1093, 1094, 91, 88, 89, 95, 94, 92, 90, 97, 98, 96, 93, 55, 77, 66, + 85, 56, 20, 67, 86, 49, 71, 68, 79, 53, 75, 64, 83, 51, 73, 62, 81, 52, 74, 63, 82, + 50, 72, 61, 80, 57, 78, 69, 87, 54, 76, 65, 84, 830, 831, 832, 833, 821, 822, 823, 824}}, + {"minecraft:inside_step_sound_blocks", {959, 963, 336, 343, 942, 1049, 1050, 1051}}, + {"minecraft:prevent_mob_spawning_inside", {209, 126, 127, 450}}, + {"minecraft:terracotta", {522, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467}}, + {"minecraft:climbable", {208, 335, 804, 837, 838, 839, 840, 1043, 1044}}, + {"minecraft:wart_blocks", {640, 827}}, + {"minecraft:parrots_spawnable_on", + {8, 0, 91, 88, 89, 95, 94, 92, 90, 97, 98, 96, 93, 55, 77, 66, 85, 56, 20, 67, 86, 49, 71, 68, 79, 53, 75, 64, 83, + 51, 73, 62, 81, 52, 74, 63, 82, 50, 72, 61, 80, 57, 78, 69, 87, 54, 76, 65, 84, 830, 831, 832, 833, 821, 822, 823, 824}}, + {"minecraft:dark_oak_logs", {55, 77, 66, 85}}, + {"minecraft:frog_prefer_jump_to", {343, 1053}}, + {"minecraft:coral_plants", {730, 731, 732, 733, 734}}, + {"minecraft:goats_spawnable_on", {8, 1, 263, 265, 524, 40}}, + {"minecraft:ceiling_hanging_signs", {221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232}}, + {"minecraft:sculk_replaceable_world_gen", + {1, 2, 4, 6, 943, 1059, 9, 8, 11, 10, 342, 1057, 1052, 1096, 1058, 59, 522, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 834, 825, 272, 275, 883, + 37, 39, 40, 273, 274, 957, 1080, 268, 1042, 362, 563, 106, 1072, 1068, 1060, 1077, 1078, 1064}}, + {"minecraft:beacon_base_blocks", {874, 372, 192, 173, 174}}, + {"minecraft:frogs_spawnable_on", {8, 1058, 58, 59}}, + {"minecraft:shulker_boxes", {645, 661, 657, 658, 655, 653, 659, 649, 654, 651, 648, 647, 652, 656, 660, 646, 650}}, + {"minecraft:blocks_wind_charge_explosions", {492, 34}}, + {"minecraft:anvil", {435, 436, 437}}, + {"minecraft:birch_logs", {51, 73, 62, 81}}, + {"minecraft:moss_replaceable", {1, 2, 4, 6, 943, 1059, 1044, 1043, 9, 8, 11, 10, 342, 1057, 1052, 1096, 1058, 59}}, + {"minecraft:lapis_ores", {102, 103}}, + {"minecraft:wall_corals", {750, 751, 752, 753, 754}}, + {"minecraft:maintains_farmland", {333, 331, 334, 332, 633, 409, 410, 630, 158, 631, 194}}, + {"minecraft:convertable_to_mud", {9, 10, 1057}}, + {"minecraft:air", {0, 761, 762}}, + {"minecraft:sniffer_diggable_block", {9, 8, 11, 10, 1057, 1052, 1096, 1058, 59}}, + {"minecraft:lush_ground_replaceable", {1, 2, 4, 6, 943, 1059, 1044, 1043, 9, 8, 11, 10, 342, 1057, 1052, 1096, 1058, 59, 268, 40, 37}}, + {"minecraft:sword_instantly_mines", {759, 758}}, + {"minecraft:bee_attractive", {157, 1099, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 170, 169, 158, + 525, 526, 528, 527, 632, 98, 1047, 33, 93, 1049, 1050, 625, 1045, 267}}, + {"minecraft:fences", {271, 608, 610, 611, 605, 606, 607, 848, 849, 612, 613, 609, 351}}, + {"minecraft:saplings", {25, 26, 27, 28, 29, 31, 32, 1046, 1047, 33, 30}}, + {"minecraft:camels_spawnable_on", {37, 39, 38}}, + {"minecraft:mineable/pickaxe", + {1, 2, 3, 4, 5, 6, 7, 12, 42, 43, 44, 45, 46, 47, 48, 102, 103, 104, 105, 106, 107, 108, 173, + 174, 175, 179, 180, 185, 190, 191, 192, 196, 210, 246, 247, 258, 259, 272, 275, 276, 311, 312, 313, 314, 326, 327, + 339, 340, 350, 351, 352, 354, 355, 362, 366, 367, 368, 369, 372, 439, 440, 443, 444, 445, 446, 447, 448, 449, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 522, 523, 563, 564, 565, 566, 578, 579, 580, 581, 582, 583, 584, 585, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 626, 627, 628, 629, 639, 641, 642, 644, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 735, 736, 737, 738, 739, 745, 746, 747, 748, 749, 764, + 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, + 788, 789, 790, 807, 808, 811, 814, 815, 816, 817, 825, 834, 874, 875, 876, 877, 882, 883, 884, 886, 887, 888, 889, + 890, 891, 892, 894, 895, 896, 897, 900, 901, 902, 943, 957, 969, 968, 967, 966, 970, 971, 972, 973, 974, 975, 984, + 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, + 1040, 1041, 1042, 1059, 1060, 1061, 1062, 1064, 1065, 1066, 1068, 1069, 1070, 1072, 1073, 1074, 1076, 1077, 1078, 1080, 1081, 1082, 1083, + 264, 524, 756, 138, 128, 139, 939, 942, 941, 940, 937, 938, 318, 322, 321, 1079, 317, 320, 319, 262, 898, 378, 379, + 791, 792, 793, 794, 795, 796, 798, 799, 800, 801, 802, 803, 885, 893, 899, 1063, 1067, 1071, 1075, 797, 946, 950, 955, + 348, 645, 661, 657, 658, 655, 653, 659, 649, 654, 651, 648, 647, 652, 656, 660, 646, 650, 435, 436, 437, 356, 357, + 358, 359, 209, 126, 127, 450, 757, 316, 341, 586, 315, 1092, 944, 945, 951, 947, 948, 949, 952, 953, 954, 956, 979, + 978, 977, 976, 983, 982, 981, 980, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, + 1008, 1009, 1011, 1010, 1012, 1013, 1015, 1014, 1016, 1017, 1019, 1018, 1020, 1021, 1023, 1022, 1095, 345, 347, 346, 349}}, + {"minecraft:beds", {124, 125, 121, 122, 119, 117, 123, 113, 118, 115, 112, 111, 116, 120, 110, 114}}, + {"minecraft:iron_ores", {44, 45}}, + {"minecraft:unstable_bottom_center", {599, 597, 601, 602, 598, 338, 596, 852, 853, 603, 604, 600}}, + {"minecraft:oak_logs", {49, 71, 68, 79}}, + {"minecraft:doors", {207, 614, 615, 616, 617, 619, 620, 858, 859, 621, 622, 618, 1008, 1009, 1011, 1010, 1012, 1013, 1015, 1014, 247}}, + {"minecraft:enderman_holdable", + {157, 1099, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 170, 169, 158, 1100, 9, 8, 11, 10, 342, 1057, + 1052, 1096, 1058, 59, 37, 39, 40, 171, 172, 176, 266, 268, 329, 281, 330, 835, 834, 841, 826, 825, 828, 267}}, + {"minecraft:banners", {531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562}}, + {"minecraft:flower_pots", {380, 1101, 1102, 393, 394, 395, 396, 397, 398, 399, 400, 401, 392, 382, 383, 384, 385, 386, 388, + 389, 405, 406, 407, 391, 408, 402, 403, 404, 760, 878, 879, 880, 881, 1084, 1085, 390, 387, 381}}, + {"minecraft:infiniburn_overworld", {272, 639}}, + {"minecraft:smelts_to_glass", {37, 39}}, + {"minecraft:wooden_fences", {271, 608, 610, 611, 605, 606, 607, 848, 849, 612, 613, 609}}, + {"minecraft:piglin_repellents", {184, 277, 817, 278, 819}}, + {"minecraft:incorrect_for_wooden_tool", + {180, 876, 874, 877, 875, 192, 190, 191, 367, 368, 372, 173, 1083, 42, 43, 258, 259, 174, 1081, + 44, 45, 104, 102, 103, 966, 1082, 970, 971, 991, 987, 975, 968, 989, 985, 973, 969, 988, 984, + 972, 967, 990, 986, 974, 992, 1007, 1003, 999, 993, 1005, 1001, 997, 994, 1006, 1002, 998, 995, 1004, + 1000, 996, 1040, 1092, 979, 978, 977, 976, 983, 982, 981, 980, 1024, 1025, 1026, 1027, 1028, 1029, 1030, + 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1016, 1017, 1019, 1018, 1020, 1021, 1023, 1022}}, + {"minecraft:incorrect_for_iron_tool", {180, 876, 874, 877, 875}}, + {"minecraft:mooshrooms_spawnable_on", {342}}, + {"minecraft:enchantment_power_transmitter", {0, 35, 36, 130, 131, 132, 133, 134, 135, 136, 137, 183, 184, 263, 335, + 336, 337, 493, 529, 530, 643, 761, 762, 763, 828, 829, 841, 1051, 1056}}, + {"minecraft:wall_post_override", + {181, 277, 260, 371, 197, 198, 199, 200, 202, 203, 204, 860, 861, 205, 206, 201, 211, 212, 213, 214, 216, 217, 218, 862, 863, 219, + 220, 215, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 439, 440, 248, 249, 250, 251, 252, 254, 255, 846, 847, 256, 257, 253, 246, 897, 267}}, + {"minecraft:portals", {280, 360, 635}}, + {"minecraft:bamboo_plantable_on", {37, 39, 38, 9, 8, 11, 10, 342, 1057, 1052, 1096, 1058, 59, 759, 758, 40, 41}}, + {"minecraft:polar_bears_spawnable_on_alternate", {264}}, + {"minecraft:cauldrons", {356, 357, 358, 359}}, + {"minecraft:big_dripleaf_placeable", {268, 1052, 9, 8, 11, 10, 342, 1057, 1058, 59, 195}}, + {"minecraft:sword_efficient", {91, 88, 89, 95, 94, 92, 90, 97, 98, 96, 93, 335, 336, 329, 281, 282, 330, 365, 1053, 1054, 624, 625}}, + {"minecraft:pressure_plates", {439, 440, 248, 249, 250, 251, 252, 254, 255, 846, 847, 256, 257, 253, 246, 897}}, + {"minecraft:dampens_vibrations", {140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521}}, + {"minecraft:mangrove_logs", {57, 78, 69, 87}}, + {"minecraft:overworld_carver_replaceables", + {1, 2, 4, 6, 943, 1059, 9, 8, 11, 10, 342, 1057, 1052, 1096, 1058, 59, 37, 39, 38, 522, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 44, 45, 970, 971, 263, 265, 959, 35, 40, 41, 106, 563, 957, 524, 1081, 1082}}, + {"minecraft:snow_layer_can_survive_on", {872, 273, 1058}}, + {"minecraft:jungle_logs", {52, 74, 63, 82}}, + {"minecraft:vibration_resonators", {937}}, + {"minecraft:wall_hanging_signs", {233, 234, 235, 236, 237, 238, 239, 240, 242, 243, 241, 244}}, + {"minecraft:sculk_replaceable", + {1, 2, 4, 6, 943, 1059, 9, 8, 11, 10, 342, 1057, 1052, 1096, 1058, 59, 522, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 834, 825, 272, 275, 883, 37, 39, 40, 273, 274, 957, 1080, 268, 1042, 362, 563, 106}}, + {"minecraft:snow_layer_cannot_survive_on", {264, 524, 492}}, + {"minecraft:spruce_logs", {50, 72, 61, 80}}, + {"minecraft:wooden_stairs", {187, 373, 374, 375, 484, 486, 487, 854, 855, 488, 489, 485}}, + {"minecraft:ancient_city_replaceable", {1059, 1072, 1068, 1074, 1070, 1073, 1071, 1075, 1060, 1077, 1078, 147}}, + {"minecraft:signs", + {197, 198, 199, 200, 202, 203, 204, 860, 861, 205, 206, 201, 211, 212, 213, 214, 216, 217, 218, 862, 863, 219, 220, 215}}, + {"minecraft:mangrove_logs_can_grow_through", {1058, 59, 58, 96, 57, 33, 1048, 335}}, + {"minecraft:base_stone_overworld", {1, 2, 4, 6, 943, 1059}}, + {"minecraft:wooden_buttons", {411, 412, 413, 414, 415, 417, 418, 856, 857, 419, 420, 416}}, + {"minecraft:axolotls_spawnable_on", {268}}, + {"minecraft:wither_summon_base_blocks", {273, 274}}, + {"minecraft:dripstone_replaceable_blocks", {1, 2, 4, 6, 943, 1059}}, + {"minecraft:hoglin_repellents", {826, 879, 280, 877}}, + {"minecraft:stone_bricks", {311, 312, 313, 314}}, + {"minecraft:fire", {183, 184}}, + {"minecraft:mineable/axe", + {109, 759, 806, 870, 871, 1054, 1053, 177, 323, 818, 809, 281, 188, 625, 624, 365, 868, 193, 442, 810, 336, 282, 270, 208, 812, + 805, 330, 325, 329, 324, 813, 819, 438, 335, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 599, 597, 601, 602, 598, 338, 596, 852, 853, + 603, 604, 600, 55, 77, 66, 85, 56, 20, 67, 86, 49, 71, 68, 79, 53, 75, 64, 83, 51, 73, 62, 81, 52, 74, + 63, 82, 50, 72, 61, 80, 57, 78, 69, 87, 54, 76, 65, 84, 830, 831, 832, 833, 821, 822, 823, 824, 13, 14, 15, + 16, 17, 19, 21, 842, 843, 22, 23, 18, 197, 198, 199, 200, 202, 203, 204, 860, 861, 205, 206, 201, 211, 212, 213, 214, + 216, 217, 218, 862, 863, 219, 220, 215, 411, 412, 413, 414, 415, 417, 418, 856, 857, 419, 420, 416, 207, 614, 615, 616, 617, + 619, 620, 858, 859, 621, 622, 618, 271, 608, 610, 611, 605, 606, 607, 848, 849, 612, 613, 609, 248, 249, 250, 251, 252, 254, + 255, 846, 847, 256, 257, 253, 567, 568, 569, 570, 571, 573, 574, 844, 845, 575, 576, 572, 187, 373, 374, 375, 484, 486, 487, + 854, 855, 488, 489, 485, 305, 303, 307, 308, 304, 301, 302, 850, 851, 309, 310, 306, 58, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 242, 243, 241, 244, 24, 577, 490, 60, 70, 178, 186}}, + {"minecraft:base_stone_nether", {272, 275, 883}}, + {"minecraft:needs_diamond_tool", {180, 876, 874, 877, 875}}, + {"minecraft:wall_signs", {211, 212, 213, 214, 216, 217, 218, 862, 863, 219, 220, 215}}, + {"minecraft:incorrect_for_stone_tool", {180, 876, 874, 877, 875, 192, 190, 191, 367, 368, 372, 173, 1083, 42, 43, 258, 259}}, + {"minecraft:slabs", {567, 568, 569, 570, 571, 573, 574, 844, 845, 575, 576, 572, 577, 578, 579, 585, 580, 591, 588, 589, 584, + 583, 587, 582, 501, 502, 503, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 581, 590, + 886, 891, 896, 1062, 1066, 1070, 1074, 1005, 1006, 1007, 988, 989, 990, 991, 1004, 586, 944, 948, 953, 347}}, + {"minecraft:animals_spawnable_on", {8}}, + {"minecraft:guarded_by_piglins", + {173, 806, 188, 369, 894, 438, 1083, 645, 661, 657, 658, 655, 653, 659, 649, 654, 651, 648, 647, 652, 656, 660, 646, 650, 42, 48, 43}}, + {"minecraft:replaceable_by_mushrooms", {91, 88, 89, 95, 94, 92, 90, 97, 98, 96, 93, 157, 1099, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 170, 169, 158, 1100, 1097, 130, 131, 132, 335, 336, 525, 526, 527, 528, 529, + 530, 1056, 632, 35, 136, 137, 171, 172, 323, 324, 828, 829, 841, 1051, 134, 135, 133, 1103}}, + {"minecraft:mineable/shovel", {268, 9, 10, 11, 195, 8, 40, 342, 37, 39, 265, 263, 273, 634, 274, 1057, 59, 1058, + 38, 41, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709}}, + {"minecraft:nether_carver_replaceables", + {1, 2, 4, 6, 943, 1059, 272, 275, 883, 9, 8, 11, 10, 342, 1057, 1052, 1096, 1058, 59, 834, 825, 640, 827, 273, 274}}, + {"minecraft:plays_ambient_desert_block_sounds", + {522, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 37, 39}}, + {"minecraft:bats_spawnable_on", {1, 2, 4, 6, 943, 1059}}, + {"minecraft:stone_ore_replaceables", {1, 2, 4, 6}}, + {"minecraft:redstone_ores", {258, 259}}, + {"minecraft:trapdoors", {305, 303, 307, 308, 304, 301, 302, 850, 851, 309, 310, 306, 494, 1016, 1017, 1019, 1018, 1020, 1021, 1023, 1022}}, + {"minecraft:cherry_logs", {54, 76, 65, 84}}, + {"minecraft:fall_damage_resetting", {208, 335, 804, 837, 838, 839, 840, 1043, 1044, 820, 129}}, + {"minecraft:buttons", {411, 412, 413, 414, 415, 417, 418, 856, 857, 419, 420, 416, 262, 898}}, + {"minecraft:corals", {730, 731, 732, 733, 734, 740, 741, 742, 743, 744}}, + {"minecraft:flowers", {157, 1099, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 170, 169, 158, + 1100, 525, 526, 528, 527, 632, 98, 1047, 33, 93, 1049, 1050, 625, 1045, 267}}, + {"minecraft:combination_step_sound_blocks", + {506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 1048, 1097, 263, 829, 828, 841, 337}}, + {"minecraft:rabbits_spawnable_on", {8, 263, 265, 37}}, + {"minecraft:planks", {13, 14, 15, 16, 17, 19, 21, 842, 843, 22, 23, 18}}, + {"minecraft:stone_buttons", {262, 898}}, + {"minecraft:does_not_block_hoppers", {870, 871}}, + {"minecraft:soul_speed_blocks", {273, 274}}, + {"minecraft:rails", {209, 126, 127, 450}}, + {"minecraft:diamond_ores", {190, 191}}, + {"minecraft:geode_invalid_blocks", {34, 35, 36, 264, 524, 756}}, + {"minecraft:badlands_terracotta", {522, 452, 456, 453, 466, 464, 460}}, + {"minecraft:all_hanging_signs", + {221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 242, 243, 241, 244}}, + {"minecraft:overworld_natural_logs", {53, 51, 49, 52, 50, 55, 56, 57, 54}}, + {"minecraft:leaves", {91, 88, 89, 95, 94, 92, 90, 97, 98, 96, 93}}, + {"minecraft:deepslate_ore_replaceables", {1059, 943}}, + {"minecraft:walls", + {378, 379, 791, 792, 793, 794, 795, 796, 798, 799, 800, 801, 802, 803, 885, 893, 899, 1063, 1067, 1071, 1075, 797, 946, 950, 955, 348}}, + {"minecraft:cave_vines", {1044, 1043}}, + {"minecraft:coral_blocks", {720, 721, 722, 723, 724}}, + {"minecraft:strider_warm_blocks", {36}}, + {"minecraft:fence_gates", {599, 597, 601, 602, 598, 338, 596, 852, 853, 603, 604, 600}}, + {"minecraft:bee_growables", {633, 409, 410, 194, 334, 333, 630, 631, 820, 1043, 1044}}, + {"minecraft:incorrect_for_gold_tool", + {180, 876, 874, 877, 875, 192, 190, 191, 367, 368, 372, 173, 1083, 42, 43, 258, 259, 174, 1081, + 44, 45, 104, 102, 103, 966, 1082, 970, 971, 991, 987, 975, 968, 989, 985, 973, 969, 988, 984, + 972, 967, 990, 986, 974, 992, 1007, 1003, 999, 993, 1005, 1001, 997, 994, 1006, 1002, 998, 995, 1004, + 1000, 996, 1040, 1092, 979, 978, 977, 976, 983, 982, 981, 980, 1024, 1025, 1026, 1027, 1028, 1029, 1030, + 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, 1016, 1017, 1019, 1018, 1020, 1021, 1023, 1022}}, + {"minecraft:wither_immune", {492, 34, 360, 361, 635, 376, 636, 637, 864, 865, 156, 493, 1090, 866, 867}}, + {"minecraft:wooden_pressure_plates", {248, 249, 250, 251, 252, 254, 255, 846, 847, 256, 257, 253}}, + {"minecraft:acacia_logs", {53, 75, 64, 83}}, + {"minecraft:armadillo_spawnable_on", {8, 522, 452, 456, 453, 466, 464, 460, 39, 10}}, + {"minecraft:incorrect_for_netherite_tool", {}}, + {"minecraft:candles", {903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919}}, + {"minecraft:dragon_transparent", {493, 183, 184}}, + {"minecraft:underwater_bonemeals", {136, 730, 731, 732, 733, 734, 740, 741, 742, 743, 744, 750, 751, 752, 753, 754}}, + {"minecraft:stone_pressure_plates", {246, 897}}, + {"minecraft:impermeable", {101, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 958}}, + {"minecraft:copper_ores", {970, 971}}, + {"minecraft:snow", {263, 265, 959}}, + {"minecraft:sand", {37, 39, 38}}, + {"minecraft:nylium", {834, 825}}, + {"minecraft:gold_ores", {42, 48, 43}}, + {"minecraft:small_dripleaf_placeable", {268, 1052}}, + {"minecraft:incorrect_for_diamond_tool", {}}, + {"minecraft:logs_that_burn", {55, 77, 66, 85, 56, 20, 67, 86, 49, 71, 68, 79, 53, 75, 64, 83, 51, 73, + 62, 81, 52, 74, 63, 82, 50, 72, 61, 80, 57, 78, 69, 87, 54, 76, 65, 84}}, + {"minecraft:camel_sand_step_sound_blocks", {37, 39, 38, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709}}, + {"minecraft:completes_find_tree_tutorial", + {55, 77, 66, 85, 56, 20, 67, 86, 49, 71, 68, 79, 53, 75, 64, 83, 51, 73, 62, 81, 52, 74, 63, 82, 50, 72, 61, 80, 57, + 78, 69, 87, 54, 76, 65, 84, 830, 831, 832, 833, 821, 822, 823, 824, 91, 88, 89, 95, 94, 92, 90, 97, 98, 96, 93, 640, 827}}, + {"minecraft:mineable/hoe", + {91, 88, 89, 95, 94, 92, 90, 97, 98, 96, 93, 640, 827, 505, 712, 869, 836, 99, 100, 960, 961, 1052, 1048, 1096, 1097, 962, 964, 963, 965}}, + {"minecraft:replaceable", {0, 35, 36, 130, 131, 132, 133, 134, 135, 136, 137, 183, 184, 263, 335, + 336, 337, 493, 529, 530, 643, 761, 762, 763, 828, 829, 841, 1051, 1056}}, + {"minecraft:dirt", {9, 8, 11, 10, 342, 1057, 1052, 1096, 1058, 59}}, + {"minecraft:candle_cakes", {920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936}}, + {"minecraft:needs_iron_tool", {192, 190, 191, 367, 368, 372, 173, 1083, 42, 43, 258, 259}}}}, + {"minecraft:banner_pattern", + {{"minecraft:no_item_required", + {26, 27, 28, 29, 31, 38, 35, 37, 32, 36, 34, 33, 25, 5, 30, 39, 40, 41, 42, 7, 10, 9, 8, 3, 23, 19, 17, 20, 18, 1, 14, 15}}, + {"minecraft:pattern_item/piglin", {22}}, + {"minecraft:pattern_item/field_masoned", {2}}, + {"minecraft:pattern_item/flower", {12}}, + {"minecraft:pattern_item/flow", {11}}, + {"minecraft:pattern_item/creeper", {4}}, + {"minecraft:pattern_item/globe", {13}}, + {"minecraft:pattern_item/bordure_indented", {6}}, + {"minecraft:pattern_item/guster", {16}}, + {"minecraft:pattern_item/mojang", {21}}, + {"minecraft:pattern_item/skull", {24}}}}, + {"minecraft:enchantment", + {{"minecraft:tooltip_order", {2, 40, 31, 5, 41, 14, 32, 34, 1, 15, 25, 6, 4, 24, 36, 23, 10, 12, 17, 28, 27, + 3, 11, 26, 9, 13, 18, 33, 20, 8, 29, 21, 30, 0, 35, 37, 7, 38, 19, 39, 16, 22}}, + {"minecraft:double_trade_price", {2, 40, 37, 35, 14, 22, 41}}, + {"minecraft:treasure", {2, 40, 37, 35, 14, 22, 41}}, + {"minecraft:prevents_decorated_pot_shattering", {33}}, + {"minecraft:tradeable", {27, 11, 9, 3, 26, 30, 0, 38, 7, 32, 34, 1, 17, 10, 18, 36, 8, 33, 39, 13, + 25, 28, 12, 16, 20, 21, 19, 15, 31, 5, 23, 29, 24, 6, 4, 2, 40, 14, 22}}, + {"minecraft:on_traded_equipment", + {27, 11, 9, 3, 26, 30, 0, 38, 7, 32, 34, 1, 17, 10, 18, 36, 8, 33, 39, 13, 25, 28, 12, 16, 20, 21, 19, 15, 31, 5, 23, 29, 24, 6, 4}}, + {"minecraft:on_random_loot", {27, 11, 9, 3, 26, 30, 0, 38, 7, 32, 34, 1, 17, 10, 18, 36, 8, 33, 39, 13, + 25, 28, 12, 16, 20, 21, 19, 15, 31, 5, 23, 29, 24, 6, 4, 2, 40, 14, 22}}, + {"minecraft:exclusive_set/bow", {16, 22}}, + {"minecraft:prevents_bee_spawns_when_mining", {33}}, + {"minecraft:prevents_infested_spawns", {33}}, + {"minecraft:non_treasure", + {27, 11, 9, 3, 26, 30, 0, 38, 7, 32, 34, 1, 17, 10, 18, 36, 8, 33, 39, 13, 25, 28, 12, 16, 20, 21, 19, 15, 31, 5, 23, 29, 24, 6, 4}}, + {"minecraft:exclusive_set/riptide", {19, 5}}, + {"minecraft:exclusive_set/damage", {32, 34, 1, 15, 6, 4}}, + {"minecraft:on_mob_spawn_equipment", + {27, 11, 9, 3, 26, 30, 0, 38, 7, 32, 34, 1, 17, 10, 18, 36, 8, 33, 39, 13, 25, 28, 12, 16, 20, 21, 19, 15, 31, 5, 23, 29, 24, 6, 4}}, + {"minecraft:smelts_loot", {10}}, + {"minecraft:exclusive_set/crossbow", {23, 24}}, + {"minecraft:exclusive_set/armor", {27, 3, 11, 26}}, + {"minecraft:exclusive_set/boots", {14, 7}}, + {"minecraft:in_enchanting_table", + {27, 11, 9, 3, 26, 30, 0, 38, 7, 32, 34, 1, 17, 10, 18, 36, 8, 33, 39, 13, 25, 28, 12, 16, 20, 21, 19, 15, 31, 5, 23, 29, 24, 6, 4}}, + {"minecraft:prevents_ice_melting", {33}}, + {"minecraft:curse", {2, 40}}, + {"minecraft:exclusive_set/mining", {13, 33}}}}, + {"minecraft:damage_type", + {{"minecraft:bypasses_effects", {39}}, + {"minecraft:is_fall", {10, 8, 38}}, + {"minecraft:ignites_armor_stands", {21, 3}}, + {"minecraft:witch_resistant_to", {27, 23, 36, 42}}, + {"minecraft:burns_armor_stands", {31}}, + {"minecraft:bypasses_resistance", {32, 19}}, + {"minecraft:avoids_guardian_thorns", {27, 42, 15, 9, 35, 1}}, + {"minecraft:panic_environmental_causes", {2, 17, 20, 21, 24, 25, 31}}, + {"minecraft:mace_smash", {26}}, + {"minecraft:bypasses_wolf_armor", {32, 19, 4, 6, 7, 17, 22, 23, 27, 33, 39, 42, 47}}, + {"minecraft:damages_helmet", {11, 12, 13}}, + {"minecraft:burn_from_stepping", {3, 20}}, + {"minecraft:bypasses_shield", + {31, 22, 4, 6, 16, 18, 47, 5, 39, 10, 8, 17, 38, 27, 23, 32, 19, 36, 33, 2, 3, 7, 11, 13, 20, 21, 24, 25, 41}}, + {"minecraft:no_impact", {6}}, + {"minecraft:is_freezing", {17}}, + {"minecraft:is_projectile", {0, 44, 30, 45, 14, 48, 43, 46}}, + {"minecraft:bypasses_enchantments", {36}}, + {"minecraft:always_most_significant_fall", {32}}, + {"minecraft:can_break_armor_stand", {35, 34, 26}}, + {"minecraft:bypasses_armor", {31, 22, 4, 6, 16, 18, 47, 5, 39, 10, 8, 17, 38, 27, 23, 32, 19, 36, 33}}, + {"minecraft:bypasses_invulnerability", {32, 19}}, + {"minecraft:no_anger", {29}}, + {"minecraft:no_knockback", {9, 35, 1, 21, 25, 31, 24, 20, 22, 4, 6, 39, 2, 10, 8, 16, 32, 18, 27, 47, 5, 7, 41, 17, 38, 33, 19, 3}}, + {"minecraft:is_drowning", {6}}, + {"minecraft:panic_causes", {2, 17, 20, 21, 24, 25, 31, 0, 5, 9, 14, 15, 23, 27, 28, 30, 35, 36, 40, 43, 44, 45, 46, 47, 48, 34, 26}}, + {"minecraft:always_triggers_silverfish", {27}}, + {"minecraft:always_hurts_ender_dragons", {15, 9, 35, 1}}, + {"minecraft:is_fire", {21, 3, 31, 24, 20, 45, 14}}, + {"minecraft:wither_immune_to", {6}}, + {"minecraft:is_explosion", {15, 9, 35, 1}}, + {"minecraft:always_kills_armor_stands", {0, 44, 14, 48, 46}}, + {"minecraft:is_lightning", {25}}, + {"minecraft:is_player_attack", {34, 26}}}}, + {"minecraft:painting_variant", + {{"minecraft:placeable", {23, 1, 0, 2, 5, 31, 46, 34, 12, 36, 41, 13, 45, 21, 25, 8, 39, 44, 38, 49, 18, 32, 30, + 7, 37, 14, 4, 22, 26, 35, 43, 3, 6, 9, 10, 11, 16, 17, 19, 24, 27, 28, 29, 33, 40, 42}}}}, + {"minecraft:entity_type", + {{"minecraft:axolotl_always_hostiles", {36, 60, 38}}, + {"minecraft:freeze_immune_entity_types", {122, 98, 115, 139}}, + {"minecraft:immune_to_oozing", {111}}, + {"minecraft:illager", {44, 65, 97, 134}}, + {"minecraft:undead", {109, 122, 140, 110, 16, 145, 144, 146, 147, 143, 36, 64, 139, 93}}, + {"minecraft:sensitive_to_bane_of_arthropods", {11, 40, 108, 118, 21}}, + {"minecraft:boat", {84, 119, 12, 71, 0, 22, 31, 89, 78, 9}}, + {"minecraft:frog_food", {111, 77}}, + {"minecraft:can_equip_saddle", {63, 110, 145, 34, 83, 94, 123, 19}}, + {"minecraft:redirectable_projectile", {50, 137, 18}}, + {"minecraft:fall_damage_immune", {67, 115, 106, 2, 10, 11, 14, 20, 25, 55, 93, 77, 86, 92, 139, 17}}, + {"minecraft:raiders", {44, 97, 103, 134, 65, 138}}, + {"minecraft:powder_snow_walkable_mobs", {102, 40, 108, 52}}, + {"minecraft:inverted_healing_and_harm", {109, 122, 140, 110, 16, 145, 144, 146, 147, 143, 36, 64, 139, 93}}, + {"minecraft:arthropod", {11, 40, 108, 118, 21}}, + {"minecraft:immune_to_infested", {108}}, + {"minecraft:axolotl_hunt_targets", {130, 101, 104, 26, 121, 58, 124}}, + {"minecraft:zombies", {145, 144, 146, 147, 143, 36, 64}}, + {"minecraft:sensitive_to_smite", {109, 122, 140, 110, 16, 145, 144, 146, 147, 143, 36, 64, 139, 93}}, + {"minecraft:dismounts_underwater", {19, 25, 34, 63, 75, 83, 94, 103, 118, 123, 128, 145}}, + {"minecraft:can_wear_horse_armor", {63}}, + {"minecraft:beehive_inhabitors", {11}}, + {"minecraft:impact_projectiles", {6, 117, 51, 114, 50, 112, 37, 129, 35, 141, 137, 18}}, + {"minecraft:not_scary_for_pufferfish", {131, 60, 38, 26, 101, 104, 130, 33, 121, 58, 124}}, + {"minecraft:non_controlling_rider", {111, 77}}, + {"minecraft:skeletons", {109, 122, 140, 110, 16}}, + {"minecraft:can_turn_in_boats", {17}}, + {"minecraft:can_breathe_under_water", + {109, 122, 140, 110, 16, 145, 144, 146, 147, 143, 36, 64, 139, 93, 7, 53, 60, 38, 131, 58, 26, 101, 104, 121, 130, 124, 5}}, + {"minecraft:arrows", {6, 117}}, + {"minecraft:wither_friends", {109, 122, 140, 110, 16, 145, 144, 146, 147, 143, 36, 64, 139, 93}}, + {"minecraft:freeze_hurts_extra_types", {123, 14, 77}}, + {"minecraft:no_anger_from_wind_charge", {17, 109, 16, 122, 144, 64, 118, 21, 111}}, + {"minecraft:aquatic", {131, 7, 60, 38, 26, 101, 104, 130, 33, 121, 58, 124}}, + {"minecraft:illager_friends", {44, 65, 97, 134}}, + {"minecraft:ignores_poison_and_regen", {109, 122, 140, 110, 16, 145, 144, 146, 147, 143, 36, 64, 139, 93}}, + {"minecraft:deflects_projectiles", {17}}, + {"minecraft:sensitive_to_impaling", {131, 7, 60, 38, 26, 101, 104, 130, 33, 121, 58, 124}}}}, + {"minecraft:instrument", + {{"minecraft:screaming_goat_horns", {0, 1, 7, 2}}, + {"minecraft:goat_horns", {4, 6, 5, 3, 0, 1, 7, 2}}, + {"minecraft:regular_goat_horns", {4, 6, 5, 3}}}}, + {"minecraft:worldgen/biome", + {{"minecraft:has_structure/nether_fortress", {34, 49, 7, 59, 2}}, + {"minecraft:has_structure/ocean_ruin_warm", {29, 58, 12}}, + {"minecraft:is_river", {41, 24}}, + {"minecraft:water_on_map_outlines", {11, 9, 13, 12, 22, 35, 6, 29, 58, 41, 24, 54, 31}}, + {"minecraft:has_structure/mineshaft", {11, 9, 13, 12, 22, 35, 6, 29, 58, 41, 24, 3, 45, 32, 23, 27, 51, 47, 5, 62, 60, 61, 55, 48, 37, + 38, 1, 28, 50, 21, 20, 4, 36, 8, 39, 25, 52, 33, 26, 63, 14, 42, 46, 40, 53, 54, 31, 43, 15, 30}}, + {"minecraft:has_structure/jungle_temple", {1, 28}}, + {"minecraft:has_structure/trial_chambers", + {33, 11, 22, 9, 6, 13, 35, 12, 29, 58, 52, 54, 31, 47, 46, 45, 61, 25, 62, 48, 60, 55, 40, 32, 3, 21, 38, + 20, 4, 8, 39, 43, 42, 28, 0, 14, 64, 27, 51, 24, 41, 26, 37, 53, 36, 50, 1, 19, 63, 5, 23, 15, 30}}, + {"minecraft:more_frequent_drowned_spawns", {41, 24}}, + {"minecraft:has_structure/village_desert", {14}}, + {"minecraft:is_jungle", {1, 28, 50}}, + {"minecraft:spawns_snow_foxes", {46, 26, 22, 48, 24, 45, 23, 27, 47, 25}}, + {"minecraft:is_ocean", {11, 9, 13, 12, 22, 35, 6, 29, 58}}, + {"minecraft:is_forest", {21, 20, 4, 36, 8, 39, 25}}, + {"minecraft:has_structure/village_savanna", {42}}, + {"minecraft:is_overworld", {33, 11, 22, 9, 6, 13, 35, 12, 29, 58, 52, 54, 31, 47, 46, 45, 61, 25, 62, 48, 60, 55, 40, 32, 3, 21, 38, + 20, 4, 8, 39, 43, 42, 28, 0, 14, 64, 27, 51, 24, 41, 26, 37, 53, 36, 50, 1, 19, 63, 5, 23, 15, 30, 10}}, + {"minecraft:without_patrol_spawns", {33}}, + {"minecraft:has_structure/village_taiga", {55}}, + {"minecraft:allows_tropical_fish_spawns_at_any_height", {30}}, + {"minecraft:polar_bears_spawn_on_alternate_blocks", {22, 11}}, + {"minecraft:has_closer_water_fog", {54, 31}}, + {"minecraft:has_structure/village_plains", {40, 32}}, + {"minecraft:has_structure/buried_treasure", {3, 45}}, + {"minecraft:has_structure/ocean_ruin_cold", {22, 6, 35, 11, 9, 13}}, + {"minecraft:produces_corals_from_bonemeal", {58}}, + {"minecraft:snow_golem_melts", {0, 2, 7, 14, 19, 34, 42, 43, 49, 59, 63, 64}}, + {"minecraft:has_structure/stronghold", + {33, 11, 22, 9, 6, 13, 35, 12, 29, 58, 52, 54, 31, 47, 46, 45, 61, 25, 62, 48, 60, 55, 40, 32, 3, 21, 38, + 20, 4, 8, 39, 43, 42, 28, 0, 14, 64, 27, 51, 24, 41, 26, 37, 53, 36, 50, 1, 19, 63, 5, 23, 15, 30, 10}}, + {"minecraft:without_wandering_trader_spawns", {57}}, + {"minecraft:has_structure/ruined_portal_desert", {14}}, + {"minecraft:has_structure/mineshaft_mesa", {0, 19, 64}}, + {"minecraft:has_structure/ancient_city", {10}}, + {"minecraft:has_structure/ruined_portal_swamp", {54, 31}}, + {"minecraft:has_structure/shipwreck", {11, 9, 13, 12, 22, 35, 6, 29, 58}}, + {"minecraft:is_savanna", {42, 43, 63}}, + {"minecraft:has_structure/swamp_hut", {54}}, + {"minecraft:spawns_cold_variant_frogs", {46, 26, 23, 27, 47, 22, 11, 25, 10, 24, 48, 45, 56, 17, 18, 44, 16}}, + {"minecraft:has_structure/igloo", {48, 46, 47}}, + {"minecraft:has_structure/shipwreck_beached", {3, 45}}, + {"minecraft:has_structure/trail_ruins", {55, 48, 37, 38, 36, 28}}, + {"minecraft:is_hill", {62, 60, 61}}, + {"minecraft:has_structure/ruined_portal_nether", {34, 49, 7, 59, 2}}, + {"minecraft:is_end", {56, 17, 18, 44, 16}}, + {"minecraft:stronghold_biased_to", {40, 53, 46, 26, 14, 21, 20, 4, 8, 39, 36, 37, 38, 55, 48, 42, 43, 62, + 61, 60, 63, 28, 50, 1, 0, 19, 64, 32, 25, 47, 23, 27, 51, 33, 15, 30}}, + {"minecraft:without_zombie_sieges", {33}}, + {"minecraft:is_beach", {3, 45}}, + {"minecraft:has_structure/ruined_portal_standard", + {3, 45, 41, 24, 55, 48, 37, 38, 21, 20, 4, 36, 8, 39, 25, 33, 26, 15, 30, 42, 46, 40, 53}}, + {"minecraft:has_structure/pillager_outpost", {14, 40, 42, 46, 55, 32, 23, 27, 51, 47, 5, 25}}, + {"minecraft:allows_surface_slime_spawns", {54, 31}}, + {"minecraft:is_taiga", {55, 48, 37, 38}}, + {"minecraft:spawns_warm_variant_frogs", {14, 58, 1, 28, 50, 42, 43, 63, 34, 49, 7, 59, 2, 0, 19, 64, 31}}, + {"minecraft:mineshaft_blocking", {10}}, + {"minecraft:required_ocean_monument_surrounding", {11, 9, 13, 12, 22, 35, 6, 29, 58, 41, 24}}, + {"minecraft:is_mountain", {32, 23, 27, 51, 47, 5}}, + {"minecraft:has_structure/village_snowy", {46}}, + {"minecraft:has_structure/ocean_monument", {11, 9, 13, 12}}, + {"minecraft:is_badlands", {0, 19, 64}}, + {"minecraft:spawns_gold_rabbits", {14}}, + {"minecraft:spawns_white_rabbits", {46, 26, 22, 48, 24, 45, 23, 27, 47, 25}}, + {"minecraft:has_structure/ruined_portal_jungle", {1, 28, 50}}, + {"minecraft:plays_underwater_music", {11, 9, 13, 12, 22, 35, 6, 29, 58, 41, 24}}, + {"minecraft:has_structure/desert_pyramid", {14}}, + {"minecraft:has_structure/nether_fossil", {49}}, + {"minecraft:spawns_cold_variant_farm_animals", + {46, 26, 23, 27, 47, 22, 11, 25, 10, 24, 48, 45, 56, 17, 18, 44, 16, 6, 9, 37, 38, 55, 60, 61, 62, 51}}, + {"minecraft:has_structure/ruined_portal_ocean", {11, 9, 13, 12, 22, 35, 6, 29, 58}}, + {"minecraft:has_structure/end_city", {17, 18}}, + {"minecraft:is_deep_ocean", {11, 9, 13, 12}}, + {"minecraft:is_nether", {34, 49, 7, 59, 2}}, + {"minecraft:reduce_water_ambient_spawns", {41, 24}}, + {"minecraft:has_structure/bastion_remnant", {7, 34, 49, 59}}, + {"minecraft:spawns_warm_variant_farm_animals", {14, 58, 1, 28, 50, 42, 43, 63, 34, 49, 7, 59, 2, 0, 19, 64, 31, 12, 29}}, + {"minecraft:increased_fire_burnout", {1, 33, 31, 47, 23, 27, 54, 28}}, + {"minecraft:has_structure/woodland_mansion", {8, 39}}, + {"minecraft:has_structure/ruined_portal_mountain", {0, 19, 64, 62, 60, 61, 43, 63, 52, 32, 23, 27, 51, 47, 5}}}}, + {"minecraft:game_event", + {{"minecraft:vibrations", {1, 2, 3, 5, 6, 7, 8, 0, 4, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, + 32, 33, 34, 35, 36, 38, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 23}}, + {"minecraft:ignore_vibrations_sneaking", {26, 36, 41, 42, 29, 28}}, + {"minecraft:warden_can_listen", + {1, 2, 3, 5, 6, 7, 8, 0, 4, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, + 32, 33, 34, 35, 36, 38, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 39, 37}}, + {"minecraft:allay_can_listen", {33}}, + {"minecraft:shrieker_can_listen", {37}}}}, + {"minecraft:fluid", {{"minecraft:lava", {4, 3}}, {"minecraft:water", {2, 1}}}}, + {"minecraft:item", + {{"minecraft:skulls", {1167, 1169, 1168, 1165, 1166, 1170, 1171}}, + {"minecraft:soul_fire_base_blocks", {348, 349}}, + {"minecraft:trim_materials", {849, 853, 845, 846, 855, 851, 847, 856, 848, 687, 1178}}, + {"minecraft:head_armor", {896, 900, 912, 904, 908, 916, 834}}, + {"minecraft:beacon_payment_items", {856, 846, 845, 855, 851}}, + {"minecraft:wooden_slabs", {270, 271, 272, 273, 274, 276, 277, 281, 282, 278, 279, 275}}, + {"minecraft:pale_oak_logs", {140, 177, 155, 166}}, + {"minecraft:chicken_food", {893, 1047, 1046, 1218, 1215, 1216}}, + {"minecraft:coal_ores", {64, 65}}, + {"minecraft:small_flowers", {229, 230, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 231}}, + {"minecraft:parrot_poisonous_food", {1040}}, + {"minecraft:wooden_trapdoors", {768, 766, 770, 771, 767, 764, 765, 774, 775, 772, 773, 769}}, + {"minecraft:pig_food", {1159, 1160, 1217}}, + {"minecraft:repairs_leather_armor", {955}}, + {"minecraft:repairs_diamond_armor", {845}}, + {"minecraft:iron_tool_materials", {851}}, + {"minecraft:trimmable_armor", + {899, 903, 915, 907, 911, 919, 898, 902, 914, 906, 910, 918, 897, 901, 913, 905, 909, 917, 896, 900, 912, 904, 908, 916, 834}}, + {"minecraft:piglin_safe_armor", {912, 913, 914, 915}}, + {"minecraft:enchantable/mace", {1155}}, + {"minecraft:wool", {213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228}}, + {"minecraft:stairs", {412, 413, 414, 415, 416, 418, 419, 423, 424, 420, 421, 417, 422, 324, 409, 399, 391, 390, 316, 456, + 543, 537, 536, 538, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 1294, 1302, + 1298, 665, 666, 668, 667, 109, 108, 107, 106, 128, 127, 126, 129, 392, 14, 19, 23, 386}}, + {"minecraft:logs", {141, 178, 154, 165, 140, 177, 155, 166, 134, 171, 148, 159, 138, 175, 152, 163, 136, 173, 150, 161, 137, 174, + 151, 162, 135, 172, 149, 160, 142, 179, 156, 167, 139, 176, 153, 164, 145, 157, 180, 168, 146, 158, 181, 169}}, + {"minecraft:creeper_drop_music_discs", {1231, 1232, 1233, 1234, 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244}}, + {"minecraft:camel_food", {328}}, + {"minecraft:gold_tool_materials", {855}}, + {"minecraft:compasses", {972, 973}}, + {"minecraft:arrows", {842, 1223, 1222}}, + {"minecraft:repairs_wolf_armor", {836}}, + {"minecraft:wool_carpets", {476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491}}, + {"minecraft:furnace_minecart_fuel", {843, 844}}, + {"minecraft:cow_food", {894}}, + {"minecraft:bookshelf_books", {967, 1153, 1176, 1152, 1229}}, + {"minecraft:enchantable/fishing", {991}}, + {"minecraft:decorated_pot_ingredients", {963, 1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, 1361, 1363, 1364, + 1365, 1366, 1367, 1368, 1369, 1371, 1372, 1373, 1374, 1360, 1362, 1370}}, + {"minecraft:wooden_doors", {743, 744, 745, 746, 747, 749, 750, 753, 754, 751, 752, 748}}, + {"minecraft:enchantable/sword", {878, 863, 868, 883, 858, 873}}, + {"minecraft:horse_food", {894, 1022, 475, 840, 1164, 924, 925}}, + {"minecraft:meat", {1048, 1050, 1049, 1051, 1195, 922, 1182, 1194, 921, 1181, 1052}}, + {"minecraft:warped_stems", {146, 158, 181, 169}}, + {"minecraft:emerald_ores", {74, 75}}, + {"minecraft:enchantable/fire_aspect", {878, 863, 868, 883, 858, 873, 1155}}, + {"minecraft:bamboo_blocks", {147, 170}}, + {"minecraft:crimson_stems", {145, 157, 180, 168}}, + {"minecraft:wolf_food", {1048, 1050, 1049, 1051, 1195, 922, 1182, 1194, 921, 1181, 1052, 995, 999, 996, 1000, 997, 998, 1183}}, + {"minecraft:horse_tempt_items", {1164, 924, 925}}, + {"minecraft:ignored_by_piglin_babies", {955}}, + {"minecraft:enchantable/bow", {841}}, + {"minecraft:swords", {878, 863, 868, 883, 858, 873}}, + {"minecraft:enchantable/leg_armor", {898, 902, 914, 906, 910, 918}}, + {"minecraft:stone_tool_materials", {35, 1292, 9}}, + {"minecraft:terracotta", {492, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472}}, + {"minecraft:wart_blocks", {547, 548}}, + {"minecraft:dark_oak_logs", {141, 178, 154, 165}}, + {"minecraft:enchantable/durability", + {899, 903, 915, 907, 911, 919, 898, 902, 914, 906, 910, 918, 897, 901, 913, 905, 909, 917, 896, 900, 912, 904, 908, + 916, 834, 809, 1225, 878, 863, 868, 883, 858, 873, 881, 866, 871, 886, 861, 876, 880, 865, 870, 885, 860, 875, 879, + 864, 869, 884, 859, 874, 882, 867, 872, 887, 862, 877, 841, 1254, 1251, 838, 1043, 1332, 991, 806, 807, 1155}}, + {"minecraft:strider_food", {250}}, + {"minecraft:non_flammable_wood", {146, 158, 181, 169, 145, 157, 180, 168, 46, 47, 281, 282, 740, 741, 342, + 343, 774, 775, 794, 795, 423, 424, 724, 725, 753, 754, 936, 937, 949, 948}}, + {"minecraft:villager_picks_up", {893, 1160, 1159, 1218, 1215, 1216, 895, 894, 1217}}, + {"minecraft:coals", {843, 844}}, + {"minecraft:hoglin_food", {249}}, + {"minecraft:piglin_food", {921, 922}}, + {"minecraft:repairs_iron_armor", {851}}, + {"minecraft:shulker_boxes", {552, 568, 564, 565, 562, 560, 566, 556, 561, 558, 555, 554, 559, 563, 567, 553, 557}}, + {"minecraft:piglin_preferred_weapons", {1254}}, + {"minecraft:breaks_decorated_pots", {878, 863, 868, 883, 858, 873, 881, 866, 871, 886, 861, 876, 880, 865, 870, 885, + 860, 875, 879, 864, 869, 884, 859, 874, 882, 867, 872, 887, 862, 877, 1251, 1155}}, + {"minecraft:anvil", {449, 450, 451}}, + {"minecraft:panda_eats_from_ground", {269, 1023}}, + {"minecraft:birch_logs", {136, 173, 150, 161}}, + {"minecraft:lapis_ores", {76, 77}}, + {"minecraft:axes", {881, 866, 871, 886, 861, 876}}, + {"minecraft:enchantable/mining", + {881, 866, 871, 886, 861, 876, 880, 865, 870, 885, 860, 875, 879, 864, 869, 884, 859, 874, 882, 867, 872, 887, 862, 877, 1043}}, + {"minecraft:hoes", {882, 867, 872, 887, 862, 877}}, + {"minecraft:repairs_turtle_helmet", {835}}, + {"minecraft:llama_food", {894, 475}}, + {"minecraft:sniffer_food", {1215}}, + {"minecraft:enchantable/head_armor", {896, 900, 912, 904, 908, 916, 834}}, + {"minecraft:fences", {332, 336, 338, 339, 333, 334, 335, 342, 343, 340, 341, 337, 398}}, + {"minecraft:saplings", {49, 50, 51, 52, 53, 55, 56, 205, 206, 57, 54}}, + {"minecraft:parrot_food", {893, 1047, 1046, 1218, 1215, 1216}}, + {"minecraft:beds", {1038, 1039, 1035, 1036, 1033, 1031, 1037, 1027, 1032, 1029, 1026, 1025, 1030, 1034, 1024, 1028}}, + {"minecraft:rabbit_food", {1159, 1164, 229}}, + {"minecraft:iron_ores", {66, 67}}, + {"minecraft:enchantable/armor", + {899, 903, 915, 907, 911, 919, 898, 902, 914, 906, 910, 918, 897, 901, 913, 905, 909, 917, 896, 900, 912, 904, 908, 916, 834}}, + {"minecraft:oak_logs", {134, 171, 148, 159}}, + {"minecraft:bundles", {974, 990, 986, 987, 984, 982, 988, 978, 983, 980, 977, 976, 981, 985, 989, 979, 975}}, + {"minecraft:pillager_preferred_weapons", {1254}}, + {"minecraft:drowned_preferred_weapons", {1251}}, + {"minecraft:doors", {743, 744, 745, 746, 747, 749, 750, 753, 754, 751, 752, 748, 755, 756, 757, 758, 759, 760, 761, 762, 742}}, + {"minecraft:ocelot_food", {995, 996}}, + {"minecraft:banners", {1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211}}, + {"minecraft:noteblock_top_instruments", {1168, 1165, 1169, 1170, 1166, 1171, 1167}}, + {"minecraft:eggs", {969, 970, 971}}, + {"minecraft:brewing_fuel", {1062}}, + {"minecraft:smelts_to_glass", {59, 62}}, + {"minecraft:stone_crafting_materials", {35, 1292, 9}}, + {"minecraft:wooden_fences", {332, 336, 338, 339, 333, 334, 335, 342, 343, 340, 341, 337}}, + {"minecraft:piglin_repellents", {353, 1279, 1283}}, + {"minecraft:axolotl_food", {960}}, + {"minecraft:villager_plantable_seeds", {893, 1160, 1159, 1218, 1215, 1216}}, + {"minecraft:leg_armor", {898, 902, 914, 906, 910, 918}}, + {"minecraft:wither_skeleton_disliked_weapons", {841, 1254}}, + {"minecraft:enchantable/foot_armor", {899, 903, 915, 907, 911, 919}}, + {"minecraft:panda_food", {269}}, + {"minecraft:dampens_vibrations", {213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491}}, + {"minecraft:mangrove_logs", {142, 179, 156, 167}}, + {"minecraft:jungle_logs", {137, 174, 151, 162}}, + {"minecraft:lectern_books", {1153, 1152}}, + {"minecraft:enchantable/chest_armor", {897, 901, 913, 905, 909, 917}}, + {"minecraft:llama_tempt_items", {475}}, + {"minecraft:turtle_food", {211}}, + {"minecraft:spruce_logs", {135, 172, 149, 160}}, + {"minecraft:signs", {926, 927, 928, 930, 929, 932, 933, 936, 937, 934, 935, 931}}, + {"minecraft:wooden_stairs", {412, 413, 414, 415, 416, 418, 419, 423, 424, 420, 421, 417}}, + {"minecraft:enchantable/weapon", {878, 863, 868, 883, 858, 873, 881, 866, 871, 886, 861, 876, 1155}}, + {"minecraft:wooden_buttons", {714, 715, 716, 717, 718, 720, 721, 724, 725, 722, 723, 719}}, + {"minecraft:netherite_tool_materials", {856}}, + {"minecraft:book_cloning_target", {1152}}, + {"minecraft:fishes", {995, 999, 996, 1000, 998, 997}}, + {"minecraft:stone_bricks", {362, 363, 364, 365}}, + {"minecraft:shovels", {879, 864, 869, 884, 859, 874}}, + {"minecraft:chest_boats", {811, 813, 815, 817, 819, 823, 825, 827, 829, 821}}, + {"minecraft:creeper_igniters", {838, 1150}}, + {"minecraft:enchantable/equippable", {899, 903, 915, 907, 911, 919, 898, 902, 914, 906, 910, 918, 897, 901, 913, 905, 909, + 917, 896, 900, 912, 904, 908, 916, 834, 809, 1167, 1169, 1168, 1165, 1166, 1170, 1171, 345}}, + {"minecraft:enchantable/trident", {1251}}, + {"minecraft:enchantable/mining_loot", + {881, 866, 871, 886, 861, 876, 880, 865, 870, 885, 860, 875, 879, 864, 869, 884, 859, 874, 882, 867, 872, 887, 862, 877}}, + {"minecraft:enchantable/sharp_weapon", {878, 863, 868, 883, 858, 873, 881, 866, 871, 886, 861, 876}}, + {"minecraft:slabs", {270, 271, 272, 273, 274, 276, 277, 281, 282, 278, 279, 275, 280, 283, 284, 290, 285, 296, 293, 294, 289, + 288, 292, 287, 297, 298, 299, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 286, 295, + 1293, 1301, 1297, 682, 683, 685, 684, 132, 131, 130, 113, 112, 111, 110, 133, 291, 13, 18, 22, 387}}, + {"minecraft:repairs_netherite_armor", {856}}, + {"minecraft:enchantable/vanishing", + {899, 903, 915, 907, 911, 919, 898, 902, 914, 906, 910, 918, 897, 901, 913, 905, 909, 917, 896, + 900, 912, 904, 908, 916, 834, 809, 1225, 878, 863, 868, 883, 858, 873, 881, 866, 871, 886, 861, + 876, 880, 865, 870, 885, 860, 875, 879, 864, 869, 884, 859, 874, 882, 867, 872, 887, 862, 877, + 841, 1254, 1251, 838, 1043, 1332, 991, 806, 807, 1155, 972, 345, 1167, 1169, 1168, 1165, 1166, 1170, 1171}}, + {"minecraft:hanging_signs", {938, 939, 940, 942, 943, 941, 944, 945, 948, 949, 946, 947}}, + {"minecraft:wooden_tool_materials", {36, 37, 38, 39, 40, 42, 43, 46, 47, 44, 45, 41}}, + {"minecraft:trapdoors", {768, 766, 770, 771, 767, 764, 765, 774, 775, 772, 773, 769, 763, 776, 777, 778, 779, 780, 781, 782, 783}}, + {"minecraft:redstone_ores", {72, 73}}, + {"minecraft:duplicates_allays", {849}}, + {"minecraft:cherry_logs", {139, 176, 153, 164}}, + {"minecraft:flowers", {229, 230, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 231, 495, 496, 498, 497, 245, 192, 206, 57, 187, 258, 259, 313, 246, 329}}, + {"minecraft:buttons", {714, 715, 716, 717, 718, 720, 721, 724, 725, 722, 723, 719, 712, 713}}, + {"minecraft:dyeable", {896, 897, 898, 899, 1190, 837}}, + {"minecraft:planks", {36, 37, 38, 39, 40, 42, 43, 46, 47, 44, 45, 41}}, + {"minecraft:stone_buttons", {712, 713}}, + {"minecraft:boats", {810, 812, 814, 816, 818, 822, 824, 826, 828, 820, 811, 813, 815, 817, 819, 823, 825, 827, 829, 821}}, + {"minecraft:fox_food", {1280, 1281}}, + {"minecraft:enchantable/crossbow", {1254}}, + {"minecraft:chest_armor", {897, 901, 913, 905, 909, 917}}, + {"minecraft:skeleton_preferred_weapons", {841}}, + {"minecraft:frog_food", {968}}, + {"minecraft:rails", {798, 796, 797, 799}}, + {"minecraft:diamond_ores", {78, 79}}, + {"minecraft:strider_tempt_items", {250, 807}}, + {"minecraft:leaves", {185, 182, 183, 189, 188, 186, 184, 191, 192, 190, 187}}, + {"minecraft:walls", + {427, 428, 429, 430, 431, 432, 433, 434, 436, 437, 438, 439, 440, 441, 442, 444, 443, 445, 446, 448, 447, 435, 15, 20, 24, 388}}, + {"minecraft:gaze_disguise_equipment", {345}}, + {"minecraft:map_invisibility_equipment", {345}}, + {"minecraft:fence_gates", {788, 786, 790, 791, 787, 784, 785, 794, 795, 792, 793, 789}}, + {"minecraft:armadillo_food", {1060}}, + {"minecraft:wooden_pressure_plates", {730, 731, 732, 733, 734, 736, 737, 740, 741, 738, 739, 735}}, + {"minecraft:repairs_gold_armor", {855}}, + {"minecraft:goat_food", {894}}, + {"minecraft:acacia_logs", {138, 175, 152, 163}}, + {"minecraft:piglin_loved", + {70, 80, 71, 92, 1295, 728, 855, 1277, 992, 1164, 1067, 924, 925, 912, 913, 914, 915, 1188, 868, 870, 869, 871, 872, 854, 86}}, + {"minecraft:cat_food", {995, 996}}, + {"minecraft:sheep_food", {894}}, + {"minecraft:candles", {1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321}}, + {"minecraft:bee_food", {229, 230, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 495, 496, 498, 497, 245, 192, 206, 57, 187, 258, 259, 313, 246, 329}}, + {"minecraft:copper_ores", {68, 69}}, + {"minecraft:sand", {59, 62, 60}}, + {"minecraft:gold_ores", {70, 80, 71}}, + {"minecraft:freeze_immune_wearables", {899, 898, 897, 896, 1190}}, + {"minecraft:logs_that_burn", {141, 178, 154, 165, 140, 177, 155, 166, 134, 171, 148, 159, 138, 175, 152, 163, 136, 173, + 150, 161, 137, 174, 151, 162, 135, 172, 149, 160, 142, 179, 156, 167, 139, 176, 153, 164}}, + {"minecraft:completes_find_tree_tutorial", {141, 178, 154, 165, 140, 177, 155, 166, 134, 171, 148, 159, 138, 175, 152, 163, 136, 173, 150, + 161, 137, 174, 151, 162, 135, 172, 149, 160, 142, 179, 156, 167, 139, 176, 153, 164, 145, 157, + 180, 168, 146, 158, 181, 169, 185, 182, 183, 189, 188, 186, 184, 191, 192, 190, 187, 547, 548}}, + {"minecraft:diamond_tool_materials", {845}}, + {"minecraft:dirt", {28, 27, 30, 29, 393, 31, 262, 265, 32, 144}}, + {"minecraft:repairs_chain_armor", {851}}, + {"minecraft:pickaxes", {880, 865, 870, 885, 860, 875}}, + {"minecraft:decorated_pot_sherds", {1352, 1353, 1354, 1355, 1356, 1357, 1358, 1359, 1361, 1363, 1364, 1365, + 1366, 1367, 1368, 1369, 1371, 1372, 1373, 1374, 1360, 1362, 1370}}, + {"minecraft:foot_armor", {899, 903, 915, 907, 911, 919}}, + {"minecraft:cluster_max_harvestables", {880, 870, 875, 885, 865, 860}}}}}; + +extern const std::unordered_map> RegistriesTags; diff --git a/include/data/RegistryData.hpp b/include/data/RegistryData.hpp new file mode 100644 index 0000000..e02cfa8 --- /dev/null +++ b/include/data/RegistryData.hpp @@ -0,0 +1,53 @@ +#ifndef MC_CPP_SERVER_DATA_REGISTRY_HPP +#define MC_CPP_SERVER_DATA_REGISTRY_HPP + +#include "nbt.hpp" + +#include +#include +#include +#include + +struct RegistryDataEntry { + std::string entry_id; + bool has_data; + std::optional> data; + + RegistryDataEntry() : has_data(false) {} + + RegistryDataEntry(const std::string& id, bool hasData = false, std::optional> nbtData = std::nullopt) + : entry_id(id), has_data(hasData), data(nbtData) {} +}; + +class RegistryData { + private: + std::string _registry_id; + std::vector _entries; + + public: + RegistryData(); + RegistryData(const std::string& registryId); + + ~RegistryData(); + + RegistryData(const RegistryData& other); + RegistryData& operator=(const RegistryData& other); + + RegistryData(RegistryData&& other) noexcept; + RegistryData& operator=(RegistryData&& other) noexcept; + + const std::string& getRegistryId() const; + const std::vector& getEntries() const; + size_t getEntryCount() const; + + void addEntry(const std::string& entryId, bool hasData = false, std::optional> data = std::nullopt); + + std::vector serialize() const; + + static constexpr uint8_t PACKET_ID = 0x07; + + bool isEmpty() const; + void reserve(size_t capacity); +}; + +#endif diff --git a/include/data/RegistryDataUtils.hpp b/include/data/RegistryDataUtils.hpp new file mode 100644 index 0000000..651e043 --- /dev/null +++ b/include/data/RegistryDataUtils.hpp @@ -0,0 +1,26 @@ +#ifndef MC_CPP_SERVER_DATA_REGISTRY_UTILS_HPP +#define MC_CPP_SERVER_DATA_REGISTRY_UTILS_HPP + +#include "RegistryData.hpp" +#include "network/packet.hpp" +#include "network/server.hpp" + +#include +#include +#include + +std::vector parseMinecraftRegistries(); + +void sendRegistryData(Packet& packet, Server& server); + +bool validateRegistryData(const RegistryData& registry); + +RegistryData createRegistryFromMap(const std::string& registryName, const std::map& registryData, bool addNamespace = true); + +std::vector serializeRegistryPacket(const RegistryData& registry); + +void sendRegistryDataBatch(Packet& packet, Server& server, const std::vector& registries); + +std::vector createAllEssentialRegistries(); + +#endif // MC_CPP_SERVER_DATA_REGISTRY_UTILS_HPP diff --git a/include/data/RegistryIds.hpp b/include/data/RegistryIds.hpp new file mode 100644 index 0000000..27a24c7 --- /dev/null +++ b/include/data/RegistryIds.hpp @@ -0,0 +1,12872 @@ +#ifndef REGISTRY_IDS_HPP +#define REGISTRY_IDS_HPP + +#include +#include +#include +#include + +class RegistryIds { + public: + static std::map getActivity() { + static std::map registry = { + {"minecraft:admire_item", 12}, {"minecraft:avoid", 13}, {"minecraft:celebrate", 11}, {"minecraft:core", 0}, + {"minecraft:dig", 25}, {"minecraft:emerge", 24}, {"minecraft:fight", 10}, {"minecraft:hide", 9}, + {"minecraft:idle", 1}, {"minecraft:investigate", 22}, {"minecraft:lay_spawn", 20}, {"minecraft:long_jump", 16}, + {"minecraft:meet", 5}, {"minecraft:panic", 6}, {"minecraft:play", 3}, {"minecraft:play_dead", 15}, + {"minecraft:pre_raid", 8}, {"minecraft:raid", 7}, {"minecraft:ram", 17}, {"minecraft:rest", 4}, + {"minecraft:ride", 14}, {"minecraft:roar", 23}, {"minecraft:sniff", 21}, {"minecraft:swim", 19}, + {"minecraft:tongue", 18}, {"minecraft:work", 2}, + }; + return registry; + } + + static std::map getAttribute() { + static std::map registry = { + {"minecraft:armor", 0}, + {"minecraft:armor_toughness", 1}, + {"minecraft:attack_damage", 2}, + {"minecraft:attack_knockback", 3}, + {"minecraft:attack_speed", 4}, + {"minecraft:block_break_speed", 5}, + {"minecraft:block_interaction_range", 6}, + {"minecraft:burning_time", 7}, + {"minecraft:entity_interaction_range", 9}, + {"minecraft:explosion_knockback_resistance", 8}, + {"minecraft:fall_damage_multiplier", 10}, + {"minecraft:flying_speed", 11}, + {"minecraft:follow_range", 12}, + {"minecraft:gravity", 13}, + {"minecraft:jump_strength", 14}, + {"minecraft:knockback_resistance", 15}, + {"minecraft:luck", 16}, + {"minecraft:max_absorption", 17}, + {"minecraft:max_health", 18}, + {"minecraft:mining_efficiency", 19}, + {"minecraft:movement_efficiency", 20}, + {"minecraft:movement_speed", 21}, + {"minecraft:oxygen_bonus", 22}, + {"minecraft:safe_fall_distance", 23}, + {"minecraft:scale", 24}, + {"minecraft:sneaking_speed", 25}, + {"minecraft:spawn_reinforcements", 26}, + {"minecraft:step_height", 27}, + {"minecraft:submerged_mining_speed", 28}, + {"minecraft:sweeping_damage_ratio", 29}, + {"minecraft:tempt_range", 30}, + {"minecraft:water_movement_efficiency", 31}, + }; + return registry; + } + + static std::map getBlock() { + static std::map registry = { + {"minecraft:acacia_button", 415}, + {"minecraft:acacia_door", 617}, + {"minecraft:acacia_fence", 608}, + {"minecraft:acacia_fence_gate", 599}, + {"minecraft:acacia_hanging_sign", 224}, + {"minecraft:acacia_leaves", 92}, + {"minecraft:acacia_log", 53}, + {"minecraft:acacia_planks", 17}, + {"minecraft:acacia_pressure_plate", 252}, + {"minecraft:acacia_sapling", 29}, + {"minecraft:acacia_sign", 200}, + {"minecraft:acacia_slab", 571}, + {"minecraft:acacia_stairs", 484}, + {"minecraft:acacia_trapdoor", 305}, + {"minecraft:acacia_wall_hanging_sign", 236}, + {"minecraft:acacia_wall_sign", 214}, + {"minecraft:acacia_wood", 75}, + {"minecraft:activator_rail", 450}, + {"minecraft:air", 0}, + {"minecraft:allium", 161}, + {"minecraft:amethyst_block", 937}, + {"minecraft:amethyst_cluster", 939}, + {"minecraft:ancient_debris", 875}, + {"minecraft:andesite", 6}, + {"minecraft:andesite_slab", 787}, + {"minecraft:andesite_stairs", 774}, + {"minecraft:andesite_wall", 799}, + {"minecraft:anvil", 435}, + {"minecraft:attached_melon_stem", 332}, + {"minecraft:attached_pumpkin_stem", 331}, + {"minecraft:azalea", 1046}, + {"minecraft:azalea_leaves", 97}, + {"minecraft:azure_bluet", 162}, + {"minecraft:bamboo", 759}, + {"minecraft:bamboo_block", 60}, + {"minecraft:bamboo_button", 420}, + {"minecraft:bamboo_door", 622}, + {"minecraft:bamboo_fence", 613}, + {"minecraft:bamboo_fence_gate", 604}, + {"minecraft:bamboo_hanging_sign", 232}, + {"minecraft:bamboo_mosaic", 24}, + {"minecraft:bamboo_mosaic_slab", 577}, + {"minecraft:bamboo_mosaic_stairs", 490}, + {"minecraft:bamboo_planks", 23}, + {"minecraft:bamboo_pressure_plate", 257}, + {"minecraft:bamboo_sapling", 758}, + {"minecraft:bamboo_sign", 206}, + {"minecraft:bamboo_slab", 576}, + {"minecraft:bamboo_stairs", 489}, + {"minecraft:bamboo_trapdoor", 310}, + {"minecraft:bamboo_wall_hanging_sign", 244}, + {"minecraft:bamboo_wall_sign", 220}, + {"minecraft:barrel", 806}, + {"minecraft:barrier", 492}, + {"minecraft:basalt", 275}, + {"minecraft:beacon", 377}, + {"minecraft:bedrock", 34}, + {"minecraft:bee_nest", 870}, + {"minecraft:beehive", 871}, + {"minecraft:beetroots", 633}, + {"minecraft:bell", 815}, + {"minecraft:big_dripleaf", 1053}, + {"minecraft:big_dripleaf_stem", 1054}, + {"minecraft:birch_button", 413}, + {"minecraft:birch_door", 615}, + {"minecraft:birch_fence", 606}, + {"minecraft:birch_fence_gate", 597}, + {"minecraft:birch_hanging_sign", 223}, + {"minecraft:birch_leaves", 90}, + {"minecraft:birch_log", 51}, + {"minecraft:birch_planks", 15}, + {"minecraft:birch_pressure_plate", 250}, + {"minecraft:birch_sapling", 27}, + {"minecraft:birch_sign", 199}, + {"minecraft:birch_slab", 569}, + {"minecraft:birch_stairs", 374}, + {"minecraft:birch_trapdoor", 303}, + {"minecraft:birch_wall_hanging_sign", 235}, + {"minecraft:birch_wall_sign", 213}, + {"minecraft:birch_wood", 73}, + {"minecraft:black_banner", 546}, + {"minecraft:black_bed", 125}, + {"minecraft:black_candle", 919}, + {"minecraft:black_candle_cake", 936}, + {"minecraft:black_carpet", 521}, + {"minecraft:black_concrete", 693}, + {"minecraft:black_concrete_powder", 709}, + {"minecraft:black_glazed_terracotta", 677}, + {"minecraft:black_shulker_box", 661}, + {"minecraft:black_stained_glass", 300}, + {"minecraft:black_stained_glass_pane", 483}, + {"minecraft:black_terracotta", 467}, + {"minecraft:black_wall_banner", 562}, + {"minecraft:black_wool", 155}, + {"minecraft:blackstone", 883}, + {"minecraft:blackstone_slab", 886}, + {"minecraft:blackstone_stairs", 884}, + {"minecraft:blackstone_wall", 885}, + {"minecraft:blast_furnace", 808}, + {"minecraft:blue_banner", 542}, + {"minecraft:blue_bed", 121}, + {"minecraft:blue_candle", 915}, + {"minecraft:blue_candle_cake", 932}, + {"minecraft:blue_carpet", 517}, + {"minecraft:blue_concrete", 689}, + {"minecraft:blue_concrete_powder", 705}, + {"minecraft:blue_glazed_terracotta", 673}, + {"minecraft:blue_ice", 756}, + {"minecraft:blue_orchid", 160}, + {"minecraft:blue_shulker_box", 657}, + {"minecraft:blue_stained_glass", 296}, + {"minecraft:blue_stained_glass_pane", 479}, + {"minecraft:blue_terracotta", 463}, + {"minecraft:blue_wall_banner", 558}, + {"minecraft:blue_wool", 151}, + {"minecraft:bone_block", 642}, + {"minecraft:bookshelf", 177}, + {"minecraft:brain_coral", 731}, + {"minecraft:brain_coral_block", 721}, + {"minecraft:brain_coral_fan", 741}, + {"minecraft:brain_coral_wall_fan", 751}, + {"minecraft:brewing_stand", 355}, + {"minecraft:brick_slab", 584}, + {"minecraft:brick_stairs", 339}, + {"minecraft:brick_wall", 791}, + {"minecraft:bricks", 175}, + {"minecraft:brown_banner", 543}, + {"minecraft:brown_bed", 122}, + {"minecraft:brown_candle", 916}, + {"minecraft:brown_candle_cake", 933}, + {"minecraft:brown_carpet", 518}, + {"minecraft:brown_concrete", 690}, + {"minecraft:brown_concrete_powder", 706}, + {"minecraft:brown_glazed_terracotta", 674}, + {"minecraft:brown_mushroom", 171}, + {"minecraft:brown_mushroom_block", 323}, + {"minecraft:brown_shulker_box", 658}, + {"minecraft:brown_stained_glass", 297}, + {"minecraft:brown_stained_glass_pane", 480}, + {"minecraft:brown_terracotta", 464}, + {"minecraft:brown_wall_banner", 559}, + {"minecraft:brown_wool", 152}, + {"minecraft:bubble_column", 763}, + {"minecraft:bubble_coral", 732}, + {"minecraft:bubble_coral_block", 722}, + {"minecraft:bubble_coral_fan", 742}, + {"minecraft:bubble_coral_wall_fan", 752}, + {"minecraft:budding_amethyst", 938}, + {"minecraft:bush", 133}, + {"minecraft:cactus", 266}, + {"minecraft:cactus_flower", 267}, + {"minecraft:cake", 283}, + {"minecraft:calcite", 957}, + {"minecraft:calibrated_sculk_sensor", 961}, + {"minecraft:campfire", 818}, + {"minecraft:candle", 903}, + {"minecraft:candle_cake", 920}, + {"minecraft:carrots", 409}, + {"minecraft:cartography_table", 809}, + {"minecraft:carved_pumpkin", 281}, + {"minecraft:cauldron", 356}, + {"minecraft:cave_air", 762}, + {"minecraft:cave_vines", 1043}, + {"minecraft:cave_vines_plant", 1044}, + {"minecraft:chain", 327}, + {"minecraft:chain_command_block", 637}, + {"minecraft:cherry_button", 416}, + {"minecraft:cherry_door", 618}, + {"minecraft:cherry_fence", 609}, + {"minecraft:cherry_fence_gate", 600}, + {"minecraft:cherry_hanging_sign", 225}, + {"minecraft:cherry_leaves", 93}, + {"minecraft:cherry_log", 54}, + {"minecraft:cherry_planks", 18}, + {"minecraft:cherry_pressure_plate", 253}, + {"minecraft:cherry_sapling", 30}, + {"minecraft:cherry_sign", 201}, + {"minecraft:cherry_slab", 572}, + {"minecraft:cherry_stairs", 485}, + {"minecraft:cherry_trapdoor", 306}, + {"minecraft:cherry_wall_hanging_sign", 237}, + {"minecraft:cherry_wall_sign", 215}, + {"minecraft:cherry_wood", 76}, + {"minecraft:chest", 188}, + {"minecraft:chipped_anvil", 436}, + {"minecraft:chiseled_bookshelf", 178}, + {"minecraft:chiseled_copper", 979}, + {"minecraft:chiseled_deepslate", 1076}, + {"minecraft:chiseled_nether_bricks", 900}, + {"minecraft:chiseled_polished_blackstone", 890}, + {"minecraft:chiseled_quartz_block", 447}, + {"minecraft:chiseled_red_sandstone", 564}, + {"minecraft:chiseled_resin_bricks", 349}, + {"minecraft:chiseled_sandstone", 107}, + {"minecraft:chiseled_stone_bricks", 314}, + {"minecraft:chiseled_tuff", 951}, + {"minecraft:chiseled_tuff_bricks", 956}, + {"minecraft:chorus_flower", 625}, + {"minecraft:chorus_plant", 624}, + {"minecraft:clay", 268}, + {"minecraft:closed_eyeblossom", 1100}, + {"minecraft:coal_block", 523}, + {"minecraft:coal_ore", 46}, + {"minecraft:coarse_dirt", 10}, + {"minecraft:cobbled_deepslate", 1060}, + {"minecraft:cobbled_deepslate_slab", 1062}, + {"minecraft:cobbled_deepslate_stairs", 1061}, + {"minecraft:cobbled_deepslate_wall", 1063}, + {"minecraft:cobblestone", 12}, + {"minecraft:cobblestone_slab", 583}, + {"minecraft:cobblestone_stairs", 210}, + {"minecraft:cobblestone_wall", 378}, + {"minecraft:cobweb", 129}, + {"minecraft:cocoa", 365}, + {"minecraft:command_block", 376}, + {"minecraft:comparator", 441}, + {"minecraft:composter", 868}, + {"minecraft:conduit", 757}, + {"minecraft:copper_block", 966}, + {"minecraft:copper_bulb", 1032}, + {"minecraft:copper_door", 1008}, + {"minecraft:copper_grate", 1024}, + {"minecraft:copper_ore", 970}, + {"minecraft:copper_trapdoor", 1016}, + {"minecraft:cornflower", 168}, + {"minecraft:cracked_deepslate_bricks", 1077}, + {"minecraft:cracked_deepslate_tiles", 1078}, + {"minecraft:cracked_nether_bricks", 901}, + {"minecraft:cracked_polished_blackstone_bricks", 889}, + {"minecraft:cracked_stone_bricks", 313}, + {"minecraft:crafter", 1092}, + {"minecraft:crafting_table", 193}, + {"minecraft:creaking_heart", 186}, + {"minecraft:creeper_head", 429}, + {"minecraft:creeper_wall_head", 430}, + {"minecraft:crimson_button", 856}, + {"minecraft:crimson_door", 858}, + {"minecraft:crimson_fence", 848}, + {"minecraft:crimson_fence_gate", 852}, + {"minecraft:crimson_fungus", 835}, + {"minecraft:crimson_hanging_sign", 229}, + {"minecraft:crimson_hyphae", 832}, + {"minecraft:crimson_nylium", 834}, + {"minecraft:crimson_planks", 842}, + {"minecraft:crimson_pressure_plate", 846}, + {"minecraft:crimson_roots", 841}, + {"minecraft:crimson_sign", 860}, + {"minecraft:crimson_slab", 844}, + {"minecraft:crimson_stairs", 854}, + {"minecraft:crimson_stem", 830}, + {"minecraft:crimson_trapdoor", 850}, + {"minecraft:crimson_wall_hanging_sign", 242}, + {"minecraft:crimson_wall_sign", 862}, + {"minecraft:crying_obsidian", 876}, + {"minecraft:cut_copper", 975}, + {"minecraft:cut_copper_slab", 991}, + {"minecraft:cut_copper_stairs", 987}, + {"minecraft:cut_red_sandstone", 565}, + {"minecraft:cut_red_sandstone_slab", 590}, + {"minecraft:cut_sandstone", 108}, + {"minecraft:cut_sandstone_slab", 581}, + {"minecraft:cyan_banner", 540}, + {"minecraft:cyan_bed", 119}, + {"minecraft:cyan_candle", 913}, + {"minecraft:cyan_candle_cake", 930}, + {"minecraft:cyan_carpet", 515}, + {"minecraft:cyan_concrete", 687}, + {"minecraft:cyan_concrete_powder", 703}, + {"minecraft:cyan_glazed_terracotta", 671}, + {"minecraft:cyan_shulker_box", 655}, + {"minecraft:cyan_stained_glass", 294}, + {"minecraft:cyan_stained_glass_pane", 477}, + {"minecraft:cyan_terracotta", 461}, + {"minecraft:cyan_wall_banner", 556}, + {"minecraft:cyan_wool", 149}, + {"minecraft:damaged_anvil", 437}, + {"minecraft:dandelion", 157}, + {"minecraft:dark_oak_button", 417}, + {"minecraft:dark_oak_door", 619}, + {"minecraft:dark_oak_fence", 610}, + {"minecraft:dark_oak_fence_gate", 601}, + {"minecraft:dark_oak_hanging_sign", 227}, + {"minecraft:dark_oak_leaves", 94}, + {"minecraft:dark_oak_log", 55}, + {"minecraft:dark_oak_planks", 19}, + {"minecraft:dark_oak_pressure_plate", 254}, + {"minecraft:dark_oak_sapling", 31}, + {"minecraft:dark_oak_sign", 203}, + {"minecraft:dark_oak_slab", 573}, + {"minecraft:dark_oak_stairs", 486}, + {"minecraft:dark_oak_trapdoor", 307}, + {"minecraft:dark_oak_wall_hanging_sign", 239}, + {"minecraft:dark_oak_wall_sign", 217}, + {"minecraft:dark_oak_wood", 77}, + {"minecraft:dark_prismarine", 497}, + {"minecraft:dark_prismarine_slab", 503}, + {"minecraft:dark_prismarine_stairs", 500}, + {"minecraft:daylight_detector", 442}, + {"minecraft:dead_brain_coral", 726}, + {"minecraft:dead_brain_coral_block", 716}, + {"minecraft:dead_brain_coral_fan", 736}, + {"minecraft:dead_brain_coral_wall_fan", 746}, + {"minecraft:dead_bubble_coral", 727}, + {"minecraft:dead_bubble_coral_block", 717}, + {"minecraft:dead_bubble_coral_fan", 737}, + {"minecraft:dead_bubble_coral_wall_fan", 747}, + {"minecraft:dead_bush", 132}, + {"minecraft:dead_fire_coral", 728}, + {"minecraft:dead_fire_coral_block", 718}, + {"minecraft:dead_fire_coral_fan", 738}, + {"minecraft:dead_fire_coral_wall_fan", 748}, + {"minecraft:dead_horn_coral", 729}, + {"minecraft:dead_horn_coral_block", 719}, + {"minecraft:dead_horn_coral_fan", 739}, + {"minecraft:dead_horn_coral_wall_fan", 749}, + {"minecraft:dead_tube_coral", 725}, + {"minecraft:dead_tube_coral_block", 715}, + {"minecraft:dead_tube_coral_fan", 735}, + {"minecraft:dead_tube_coral_wall_fan", 745}, + {"minecraft:decorated_pot", 1091}, + {"minecraft:deepslate", 1059}, + {"minecraft:deepslate_brick_slab", 1074}, + {"minecraft:deepslate_brick_stairs", 1073}, + {"minecraft:deepslate_brick_wall", 1075}, + {"minecraft:deepslate_bricks", 1072}, + {"minecraft:deepslate_coal_ore", 47}, + {"minecraft:deepslate_copper_ore", 971}, + {"minecraft:deepslate_diamond_ore", 191}, + {"minecraft:deepslate_emerald_ore", 368}, + {"minecraft:deepslate_gold_ore", 43}, + {"minecraft:deepslate_iron_ore", 45}, + {"minecraft:deepslate_lapis_ore", 103}, + {"minecraft:deepslate_redstone_ore", 259}, + {"minecraft:deepslate_tile_slab", 1070}, + {"minecraft:deepslate_tile_stairs", 1069}, + {"minecraft:deepslate_tile_wall", 1071}, + {"minecraft:deepslate_tiles", 1068}, + {"minecraft:detector_rail", 127}, + {"minecraft:diamond_block", 192}, + {"minecraft:diamond_ore", 190}, + {"minecraft:diorite", 4}, + {"minecraft:diorite_slab", 790}, + {"minecraft:diorite_stairs", 777}, + {"minecraft:diorite_wall", 803}, + {"minecraft:dirt", 9}, + {"minecraft:dirt_path", 634}, + {"minecraft:dispenser", 105}, + {"minecraft:dragon_egg", 363}, + {"minecraft:dragon_head", 431}, + {"minecraft:dragon_wall_head", 432}, + {"minecraft:dried_kelp_block", 712}, + {"minecraft:dripstone_block", 1042}, + {"minecraft:dropper", 451}, + {"minecraft:emerald_block", 372}, + {"minecraft:emerald_ore", 367}, + {"minecraft:enchanting_table", 354}, + {"minecraft:end_gateway", 635}, + {"minecraft:end_portal", 360}, + {"minecraft:end_portal_frame", 361}, + {"minecraft:end_rod", 623}, + {"minecraft:end_stone", 362}, + {"minecraft:end_stone_brick_slab", 783}, + {"minecraft:end_stone_brick_stairs", 769}, + {"minecraft:end_stone_brick_wall", 802}, + {"minecraft:end_stone_bricks", 629}, + {"minecraft:ender_chest", 369}, + {"minecraft:exposed_chiseled_copper", 978}, + {"minecraft:exposed_copper", 967}, + {"minecraft:exposed_copper_bulb", 1033}, + {"minecraft:exposed_copper_door", 1009}, + {"minecraft:exposed_copper_grate", 1025}, + {"minecraft:exposed_copper_trapdoor", 1017}, + {"minecraft:exposed_cut_copper", 974}, + {"minecraft:exposed_cut_copper_slab", 990}, + {"minecraft:exposed_cut_copper_stairs", 986}, + {"minecraft:farmland", 195}, + {"minecraft:fern", 131}, + {"minecraft:fire", 183}, + {"minecraft:fire_coral", 733}, + {"minecraft:fire_coral_block", 723}, + {"minecraft:fire_coral_fan", 743}, + {"minecraft:fire_coral_wall_fan", 753}, + {"minecraft:firefly_bush", 1103}, + {"minecraft:fletching_table", 810}, + {"minecraft:flower_pot", 380}, + {"minecraft:flowering_azalea", 1047}, + {"minecraft:flowering_azalea_leaves", 98}, + {"minecraft:frogspawn", 1089}, + {"minecraft:frosted_ice", 638}, + {"minecraft:furnace", 196}, + {"minecraft:gilded_blackstone", 894}, + {"minecraft:glass", 101}, + {"minecraft:glass_pane", 328}, + {"minecraft:glow_lichen", 336}, + {"minecraft:glowstone", 279}, + {"minecraft:gold_block", 173}, + {"minecraft:gold_ore", 42}, + {"minecraft:granite", 2}, + {"minecraft:granite_slab", 786}, + {"minecraft:granite_stairs", 773}, + {"minecraft:granite_wall", 795}, + {"minecraft:grass_block", 8}, + {"minecraft:gravel", 40}, + {"minecraft:gray_banner", 538}, + {"minecraft:gray_bed", 117}, + {"minecraft:gray_candle", 911}, + {"minecraft:gray_candle_cake", 928}, + {"minecraft:gray_carpet", 513}, + {"minecraft:gray_concrete", 685}, + {"minecraft:gray_concrete_powder", 701}, + {"minecraft:gray_glazed_terracotta", 669}, + {"minecraft:gray_shulker_box", 653}, + {"minecraft:gray_stained_glass", 292}, + {"minecraft:gray_stained_glass_pane", 475}, + {"minecraft:gray_terracotta", 459}, + {"minecraft:gray_wall_banner", 554}, + {"minecraft:gray_wool", 147}, + {"minecraft:green_banner", 544}, + {"minecraft:green_bed", 123}, + {"minecraft:green_candle", 917}, + {"minecraft:green_candle_cake", 934}, + {"minecraft:green_carpet", 519}, + {"minecraft:green_concrete", 691}, + {"minecraft:green_concrete_powder", 707}, + {"minecraft:green_glazed_terracotta", 675}, + {"minecraft:green_shulker_box", 659}, + {"minecraft:green_stained_glass", 298}, + {"minecraft:green_stained_glass_pane", 481}, + {"minecraft:green_terracotta", 465}, + {"minecraft:green_wall_banner", 560}, + {"minecraft:green_wool", 153}, + {"minecraft:grindstone", 811}, + {"minecraft:hanging_roots", 1056}, + {"minecraft:hay_block", 505}, + {"minecraft:heavy_core", 1095}, + {"minecraft:heavy_weighted_pressure_plate", 440}, + {"minecraft:honey_block", 872}, + {"minecraft:honeycomb_block", 873}, + {"minecraft:hopper", 445}, + {"minecraft:horn_coral", 734}, + {"minecraft:horn_coral_block", 724}, + {"minecraft:horn_coral_fan", 744}, + {"minecraft:horn_coral_wall_fan", 754}, + {"minecraft:ice", 264}, + {"minecraft:infested_chiseled_stone_bricks", 322}, + {"minecraft:infested_cobblestone", 318}, + {"minecraft:infested_cracked_stone_bricks", 321}, + {"minecraft:infested_deepslate", 1079}, + {"minecraft:infested_mossy_stone_bricks", 320}, + {"minecraft:infested_stone", 317}, + {"minecraft:infested_stone_bricks", 319}, + {"minecraft:iron_bars", 326}, + {"minecraft:iron_block", 174}, + {"minecraft:iron_door", 247}, + {"minecraft:iron_ore", 44}, + {"minecraft:iron_trapdoor", 494}, + {"minecraft:jack_o_lantern", 282}, + {"minecraft:jigsaw", 865}, + {"minecraft:jukebox", 270}, + {"minecraft:jungle_button", 414}, + {"minecraft:jungle_door", 616}, + {"minecraft:jungle_fence", 607}, + {"minecraft:jungle_fence_gate", 598}, + {"minecraft:jungle_hanging_sign", 226}, + {"minecraft:jungle_leaves", 91}, + {"minecraft:jungle_log", 52}, + {"minecraft:jungle_planks", 16}, + {"minecraft:jungle_pressure_plate", 251}, + {"minecraft:jungle_sapling", 28}, + {"minecraft:jungle_sign", 202}, + {"minecraft:jungle_slab", 570}, + {"minecraft:jungle_stairs", 375}, + {"minecraft:jungle_trapdoor", 304}, + {"minecraft:jungle_wall_hanging_sign", 238}, + {"minecraft:jungle_wall_sign", 216}, + {"minecraft:jungle_wood", 74}, + {"minecraft:kelp", 710}, + {"minecraft:kelp_plant", 711}, + {"minecraft:ladder", 208}, + {"minecraft:lantern", 816}, + {"minecraft:lapis_block", 104}, + {"minecraft:lapis_ore", 102}, + {"minecraft:large_amethyst_bud", 940}, + {"minecraft:large_fern", 530}, + {"minecraft:lava", 36}, + {"minecraft:lava_cauldron", 358}, + {"minecraft:leaf_litter", 1051}, + {"minecraft:lectern", 812}, + {"minecraft:lever", 245}, + {"minecraft:light", 493}, + {"minecraft:light_blue_banner", 534}, + {"minecraft:light_blue_bed", 113}, + {"minecraft:light_blue_candle", 907}, + {"minecraft:light_blue_candle_cake", 924}, + {"minecraft:light_blue_carpet", 509}, + {"minecraft:light_blue_concrete", 681}, + {"minecraft:light_blue_concrete_powder", 697}, + {"minecraft:light_blue_glazed_terracotta", 665}, + {"minecraft:light_blue_shulker_box", 649}, + {"minecraft:light_blue_stained_glass", 288}, + {"minecraft:light_blue_stained_glass_pane", 471}, + {"minecraft:light_blue_terracotta", 455}, + {"minecraft:light_blue_wall_banner", 550}, + {"minecraft:light_blue_wool", 143}, + {"minecraft:light_gray_banner", 539}, + {"minecraft:light_gray_bed", 118}, + {"minecraft:light_gray_candle", 912}, + {"minecraft:light_gray_candle_cake", 929}, + {"minecraft:light_gray_carpet", 514}, + {"minecraft:light_gray_concrete", 686}, + {"minecraft:light_gray_concrete_powder", 702}, + {"minecraft:light_gray_glazed_terracotta", 670}, + {"minecraft:light_gray_shulker_box", 654}, + {"minecraft:light_gray_stained_glass", 293}, + {"minecraft:light_gray_stained_glass_pane", 476}, + {"minecraft:light_gray_terracotta", 460}, + {"minecraft:light_gray_wall_banner", 555}, + {"minecraft:light_gray_wool", 148}, + {"minecraft:light_weighted_pressure_plate", 439}, + {"minecraft:lightning_rod", 1040}, + {"minecraft:lilac", 526}, + {"minecraft:lily_of_the_valley", 170}, + {"minecraft:lily_pad", 343}, + {"minecraft:lime_banner", 536}, + {"minecraft:lime_bed", 115}, + {"minecraft:lime_candle", 909}, + {"minecraft:lime_candle_cake", 926}, + {"minecraft:lime_carpet", 511}, + {"minecraft:lime_concrete", 683}, + {"minecraft:lime_concrete_powder", 699}, + {"minecraft:lime_glazed_terracotta", 667}, + {"minecraft:lime_shulker_box", 651}, + {"minecraft:lime_stained_glass", 290}, + {"minecraft:lime_stained_glass_pane", 473}, + {"minecraft:lime_terracotta", 457}, + {"minecraft:lime_wall_banner", 552}, + {"minecraft:lime_wool", 145}, + {"minecraft:lodestone", 882}, + {"minecraft:loom", 805}, + {"minecraft:magenta_banner", 533}, + {"minecraft:magenta_bed", 112}, + {"minecraft:magenta_candle", 906}, + {"minecraft:magenta_candle_cake", 923}, + {"minecraft:magenta_carpet", 508}, + {"minecraft:magenta_concrete", 680}, + {"minecraft:magenta_concrete_powder", 696}, + {"minecraft:magenta_glazed_terracotta", 664}, + {"minecraft:magenta_shulker_box", 648}, + {"minecraft:magenta_stained_glass", 287}, + {"minecraft:magenta_stained_glass_pane", 470}, + {"minecraft:magenta_terracotta", 454}, + {"minecraft:magenta_wall_banner", 549}, + {"minecraft:magenta_wool", 142}, + {"minecraft:magma_block", 639}, + {"minecraft:mangrove_button", 419}, + {"minecraft:mangrove_door", 621}, + {"minecraft:mangrove_fence", 612}, + {"minecraft:mangrove_fence_gate", 603}, + {"minecraft:mangrove_hanging_sign", 231}, + {"minecraft:mangrove_leaves", 96}, + {"minecraft:mangrove_log", 57}, + {"minecraft:mangrove_planks", 22}, + {"minecraft:mangrove_pressure_plate", 256}, + {"minecraft:mangrove_propagule", 33}, + {"minecraft:mangrove_roots", 58}, + {"minecraft:mangrove_sign", 205}, + {"minecraft:mangrove_slab", 575}, + {"minecraft:mangrove_stairs", 488}, + {"minecraft:mangrove_trapdoor", 309}, + {"minecraft:mangrove_wall_hanging_sign", 241}, + {"minecraft:mangrove_wall_sign", 219}, + {"minecraft:mangrove_wood", 78}, + {"minecraft:medium_amethyst_bud", 941}, + {"minecraft:melon", 330}, + {"minecraft:melon_stem", 334}, + {"minecraft:moss_block", 1052}, + {"minecraft:moss_carpet", 1048}, + {"minecraft:mossy_cobblestone", 179}, + {"minecraft:mossy_cobblestone_slab", 782}, + {"minecraft:mossy_cobblestone_stairs", 768}, + {"minecraft:mossy_cobblestone_wall", 379}, + {"minecraft:mossy_stone_brick_slab", 780}, + {"minecraft:mossy_stone_brick_stairs", 766}, + {"minecraft:mossy_stone_brick_wall", 794}, + {"minecraft:mossy_stone_bricks", 312}, + {"minecraft:moving_piston", 156}, + {"minecraft:mud", 1058}, + {"minecraft:mud_brick_slab", 586}, + {"minecraft:mud_brick_stairs", 341}, + {"minecraft:mud_brick_wall", 797}, + {"minecraft:mud_bricks", 316}, + {"minecraft:muddy_mangrove_roots", 59}, + {"minecraft:mushroom_stem", 325}, + {"minecraft:mycelium", 342}, + {"minecraft:nether_brick_fence", 351}, + {"minecraft:nether_brick_slab", 587}, + {"minecraft:nether_brick_stairs", 352}, + {"minecraft:nether_brick_wall", 798}, + {"minecraft:nether_bricks", 350}, + {"minecraft:nether_gold_ore", 48}, + {"minecraft:nether_portal", 280}, + {"minecraft:nether_quartz_ore", 444}, + {"minecraft:nether_sprouts", 829}, + {"minecraft:nether_wart", 353}, + {"minecraft:nether_wart_block", 640}, + {"minecraft:netherite_block", 874}, + {"minecraft:netherrack", 272}, + {"minecraft:note_block", 109}, + {"minecraft:oak_button", 411}, + {"minecraft:oak_door", 207}, + {"minecraft:oak_fence", 271}, + {"minecraft:oak_fence_gate", 338}, + {"minecraft:oak_hanging_sign", 221}, + {"minecraft:oak_leaves", 88}, + {"minecraft:oak_log", 49}, + {"minecraft:oak_planks", 13}, + {"minecraft:oak_pressure_plate", 248}, + {"minecraft:oak_sapling", 25}, + {"minecraft:oak_sign", 197}, + {"minecraft:oak_slab", 567}, + {"minecraft:oak_stairs", 187}, + {"minecraft:oak_trapdoor", 301}, + {"minecraft:oak_wall_hanging_sign", 233}, + {"minecraft:oak_wall_sign", 211}, + {"minecraft:oak_wood", 71}, + {"minecraft:observer", 644}, + {"minecraft:obsidian", 180}, + {"minecraft:ochre_froglight", 1086}, + {"minecraft:open_eyeblossom", 1099}, + {"minecraft:orange_banner", 532}, + {"minecraft:orange_bed", 111}, + {"minecraft:orange_candle", 905}, + {"minecraft:orange_candle_cake", 922}, + {"minecraft:orange_carpet", 507}, + {"minecraft:orange_concrete", 679}, + {"minecraft:orange_concrete_powder", 695}, + {"minecraft:orange_glazed_terracotta", 663}, + {"minecraft:orange_shulker_box", 647}, + {"minecraft:orange_stained_glass", 286}, + {"minecraft:orange_stained_glass_pane", 469}, + {"minecraft:orange_terracotta", 453}, + {"minecraft:orange_tulip", 164}, + {"minecraft:orange_wall_banner", 548}, + {"minecraft:orange_wool", 141}, + {"minecraft:oxeye_daisy", 167}, + {"minecraft:oxidized_chiseled_copper", 976}, + {"minecraft:oxidized_copper", 969}, + {"minecraft:oxidized_copper_bulb", 1035}, + {"minecraft:oxidized_copper_door", 1010}, + {"minecraft:oxidized_copper_grate", 1027}, + {"minecraft:oxidized_copper_trapdoor", 1018}, + {"minecraft:oxidized_cut_copper", 972}, + {"minecraft:oxidized_cut_copper_slab", 988}, + {"minecraft:oxidized_cut_copper_stairs", 984}, + {"minecraft:packed_ice", 524}, + {"minecraft:packed_mud", 315}, + {"minecraft:pale_hanging_moss", 1098}, + {"minecraft:pale_moss_block", 1096}, + {"minecraft:pale_moss_carpet", 1097}, + {"minecraft:pale_oak_button", 418}, + {"minecraft:pale_oak_door", 620}, + {"minecraft:pale_oak_fence", 611}, + {"minecraft:pale_oak_fence_gate", 602}, + {"minecraft:pale_oak_hanging_sign", 228}, + {"minecraft:pale_oak_leaves", 95}, + {"minecraft:pale_oak_log", 56}, + {"minecraft:pale_oak_planks", 21}, + {"minecraft:pale_oak_pressure_plate", 255}, + {"minecraft:pale_oak_sapling", 32}, + {"minecraft:pale_oak_sign", 204}, + {"minecraft:pale_oak_slab", 574}, + {"minecraft:pale_oak_stairs", 487}, + {"minecraft:pale_oak_trapdoor", 308}, + {"minecraft:pale_oak_wall_hanging_sign", 240}, + {"minecraft:pale_oak_wall_sign", 218}, + {"minecraft:pale_oak_wood", 20}, + {"minecraft:pearlescent_froglight", 1088}, + {"minecraft:peony", 528}, + {"minecraft:petrified_oak_slab", 582}, + {"minecraft:piglin_head", 433}, + {"minecraft:piglin_wall_head", 434}, + {"minecraft:pink_banner", 537}, + {"minecraft:pink_bed", 116}, + {"minecraft:pink_candle", 910}, + {"minecraft:pink_candle_cake", 927}, + {"minecraft:pink_carpet", 512}, + {"minecraft:pink_concrete", 684}, + {"minecraft:pink_concrete_powder", 700}, + {"minecraft:pink_glazed_terracotta", 668}, + {"minecraft:pink_petals", 1049}, + {"minecraft:pink_shulker_box", 652}, + {"minecraft:pink_stained_glass", 291}, + {"minecraft:pink_stained_glass_pane", 474}, + {"minecraft:pink_terracotta", 458}, + {"minecraft:pink_tulip", 166}, + {"minecraft:pink_wall_banner", 553}, + {"minecraft:pink_wool", 146}, + {"minecraft:piston", 138}, + {"minecraft:piston_head", 139}, + {"minecraft:pitcher_crop", 631}, + {"minecraft:pitcher_plant", 632}, + {"minecraft:player_head", 427}, + {"minecraft:player_wall_head", 428}, + {"minecraft:podzol", 11}, + {"minecraft:pointed_dripstone", 1041}, + {"minecraft:polished_andesite", 7}, + {"minecraft:polished_andesite_slab", 789}, + {"minecraft:polished_andesite_stairs", 776}, + {"minecraft:polished_basalt", 276}, + {"minecraft:polished_blackstone", 887}, + {"minecraft:polished_blackstone_brick_slab", 891}, + {"minecraft:polished_blackstone_brick_stairs", 892}, + {"minecraft:polished_blackstone_brick_wall", 893}, + {"minecraft:polished_blackstone_bricks", 888}, + {"minecraft:polished_blackstone_button", 898}, + {"minecraft:polished_blackstone_pressure_plate", 897}, + {"minecraft:polished_blackstone_slab", 896}, + {"minecraft:polished_blackstone_stairs", 895}, + {"minecraft:polished_blackstone_wall", 899}, + {"minecraft:polished_deepslate", 1064}, + {"minecraft:polished_deepslate_slab", 1066}, + {"minecraft:polished_deepslate_stairs", 1065}, + {"minecraft:polished_deepslate_wall", 1067}, + {"minecraft:polished_diorite", 5}, + {"minecraft:polished_diorite_slab", 781}, + {"minecraft:polished_diorite_stairs", 767}, + {"minecraft:polished_granite", 3}, + {"minecraft:polished_granite_slab", 778}, + {"minecraft:polished_granite_stairs", 764}, + {"minecraft:polished_tuff", 947}, + {"minecraft:polished_tuff_slab", 948}, + {"minecraft:polished_tuff_stairs", 949}, + {"minecraft:polished_tuff_wall", 950}, + {"minecraft:poppy", 159}, + {"minecraft:potatoes", 410}, + {"minecraft:potted_acacia_sapling", 386}, + {"minecraft:potted_allium", 395}, + {"minecraft:potted_azalea_bush", 1084}, + {"minecraft:potted_azure_bluet", 396}, + {"minecraft:potted_bamboo", 760}, + {"minecraft:potted_birch_sapling", 384}, + {"minecraft:potted_blue_orchid", 394}, + {"minecraft:potted_brown_mushroom", 406}, + {"minecraft:potted_cactus", 408}, + {"minecraft:potted_cherry_sapling", 387}, + {"minecraft:potted_closed_eyeblossom", 1102}, + {"minecraft:potted_cornflower", 402}, + {"minecraft:potted_crimson_fungus", 878}, + {"minecraft:potted_crimson_roots", 880}, + {"minecraft:potted_dandelion", 392}, + {"minecraft:potted_dark_oak_sapling", 388}, + {"minecraft:potted_dead_bush", 407}, + {"minecraft:potted_fern", 391}, + {"minecraft:potted_flowering_azalea_bush", 1085}, + {"minecraft:potted_jungle_sapling", 385}, + {"minecraft:potted_lily_of_the_valley", 403}, + {"minecraft:potted_mangrove_propagule", 390}, + {"minecraft:potted_oak_sapling", 382}, + {"minecraft:potted_open_eyeblossom", 1101}, + {"minecraft:potted_orange_tulip", 398}, + {"minecraft:potted_oxeye_daisy", 401}, + {"minecraft:potted_pale_oak_sapling", 389}, + {"minecraft:potted_pink_tulip", 400}, + {"minecraft:potted_poppy", 393}, + {"minecraft:potted_red_mushroom", 405}, + {"minecraft:potted_red_tulip", 397}, + {"minecraft:potted_spruce_sapling", 383}, + {"minecraft:potted_torchflower", 381}, + {"minecraft:potted_warped_fungus", 879}, + {"minecraft:potted_warped_roots", 881}, + {"minecraft:potted_white_tulip", 399}, + {"minecraft:potted_wither_rose", 404}, + {"minecraft:powder_snow", 959}, + {"minecraft:powder_snow_cauldron", 359}, + {"minecraft:powered_rail", 126}, + {"minecraft:prismarine", 495}, + {"minecraft:prismarine_brick_slab", 502}, + {"minecraft:prismarine_brick_stairs", 499}, + {"minecraft:prismarine_bricks", 496}, + {"minecraft:prismarine_slab", 501}, + {"minecraft:prismarine_stairs", 498}, + {"minecraft:prismarine_wall", 792}, + {"minecraft:pumpkin", 329}, + {"minecraft:pumpkin_stem", 333}, + {"minecraft:purple_banner", 541}, + {"minecraft:purple_bed", 120}, + {"minecraft:purple_candle", 914}, + {"minecraft:purple_candle_cake", 931}, + {"minecraft:purple_carpet", 516}, + {"minecraft:purple_concrete", 688}, + {"minecraft:purple_concrete_powder", 704}, + {"minecraft:purple_glazed_terracotta", 672}, + {"minecraft:purple_shulker_box", 656}, + {"minecraft:purple_stained_glass", 295}, + {"minecraft:purple_stained_glass_pane", 478}, + {"minecraft:purple_terracotta", 462}, + {"minecraft:purple_wall_banner", 557}, + {"minecraft:purple_wool", 150}, + {"minecraft:purpur_block", 626}, + {"minecraft:purpur_pillar", 627}, + {"minecraft:purpur_slab", 591}, + {"minecraft:purpur_stairs", 628}, + {"minecraft:quartz_block", 446}, + {"minecraft:quartz_bricks", 902}, + {"minecraft:quartz_pillar", 448}, + {"minecraft:quartz_slab", 588}, + {"minecraft:quartz_stairs", 449}, + {"minecraft:rail", 209}, + {"minecraft:raw_copper_block", 1082}, + {"minecraft:raw_gold_block", 1083}, + {"minecraft:raw_iron_block", 1081}, + {"minecraft:red_banner", 545}, + {"minecraft:red_bed", 124}, + {"minecraft:red_candle", 918}, + {"minecraft:red_candle_cake", 935}, + {"minecraft:red_carpet", 520}, + {"minecraft:red_concrete", 692}, + {"minecraft:red_concrete_powder", 708}, + {"minecraft:red_glazed_terracotta", 676}, + {"minecraft:red_mushroom", 172}, + {"minecraft:red_mushroom_block", 324}, + {"minecraft:red_nether_brick_slab", 788}, + {"minecraft:red_nether_brick_stairs", 775}, + {"minecraft:red_nether_brick_wall", 800}, + {"minecraft:red_nether_bricks", 641}, + {"minecraft:red_sand", 39}, + {"minecraft:red_sandstone", 563}, + {"minecraft:red_sandstone_slab", 589}, + {"minecraft:red_sandstone_stairs", 566}, + {"minecraft:red_sandstone_wall", 793}, + {"minecraft:red_shulker_box", 660}, + {"minecraft:red_stained_glass", 299}, + {"minecraft:red_stained_glass_pane", 482}, + {"minecraft:red_terracotta", 466}, + {"minecraft:red_tulip", 163}, + {"minecraft:red_wall_banner", 561}, + {"minecraft:red_wool", 154}, + {"minecraft:redstone_block", 443}, + {"minecraft:redstone_lamp", 364}, + {"minecraft:redstone_ore", 258}, + {"minecraft:redstone_torch", 260}, + {"minecraft:redstone_wall_torch", 261}, + {"minecraft:redstone_wire", 189}, + {"minecraft:reinforced_deepslate", 1090}, + {"minecraft:repeater", 284}, + {"minecraft:repeating_command_block", 636}, + {"minecraft:resin_block", 344}, + {"minecraft:resin_brick_slab", 347}, + {"minecraft:resin_brick_stairs", 346}, + {"minecraft:resin_brick_wall", 348}, + {"minecraft:resin_bricks", 345}, + {"minecraft:resin_clump", 337}, + {"minecraft:respawn_anchor", 877}, + {"minecraft:rooted_dirt", 1057}, + {"minecraft:rose_bush", 527}, + {"minecraft:sand", 37}, + {"minecraft:sandstone", 106}, + {"minecraft:sandstone_slab", 580}, + {"minecraft:sandstone_stairs", 366}, + {"minecraft:sandstone_wall", 801}, + {"minecraft:scaffolding", 804}, + {"minecraft:sculk", 962}, + {"minecraft:sculk_catalyst", 964}, + {"minecraft:sculk_sensor", 960}, + {"minecraft:sculk_shrieker", 965}, + {"minecraft:sculk_vein", 963}, + {"minecraft:sea_lantern", 504}, + {"minecraft:sea_pickle", 755}, + {"minecraft:seagrass", 136}, + {"minecraft:short_dry_grass", 134}, + {"minecraft:short_grass", 130}, + {"minecraft:shroomlight", 836}, + {"minecraft:shulker_box", 645}, + {"minecraft:skeleton_skull", 421}, + {"minecraft:skeleton_wall_skull", 422}, + {"minecraft:slime_block", 491}, + {"minecraft:small_amethyst_bud", 942}, + {"minecraft:small_dripleaf", 1055}, + {"minecraft:smithing_table", 813}, + {"minecraft:smoker", 807}, + {"minecraft:smooth_basalt", 1080}, + {"minecraft:smooth_quartz", 594}, + {"minecraft:smooth_quartz_slab", 785}, + {"minecraft:smooth_quartz_stairs", 772}, + {"minecraft:smooth_red_sandstone", 595}, + {"minecraft:smooth_red_sandstone_slab", 779}, + {"minecraft:smooth_red_sandstone_stairs", 765}, + {"minecraft:smooth_sandstone", 593}, + {"minecraft:smooth_sandstone_slab", 784}, + {"minecraft:smooth_sandstone_stairs", 771}, + {"minecraft:smooth_stone", 592}, + {"minecraft:smooth_stone_slab", 579}, + {"minecraft:sniffer_egg", 714}, + {"minecraft:snow", 263}, + {"minecraft:snow_block", 265}, + {"minecraft:soul_campfire", 819}, + {"minecraft:soul_fire", 184}, + {"minecraft:soul_lantern", 817}, + {"minecraft:soul_sand", 273}, + {"minecraft:soul_soil", 274}, + {"minecraft:soul_torch", 277}, + {"minecraft:soul_wall_torch", 278}, + {"minecraft:spawner", 185}, + {"minecraft:sponge", 99}, + {"minecraft:spore_blossom", 1045}, + {"minecraft:spruce_button", 412}, + {"minecraft:spruce_door", 614}, + {"minecraft:spruce_fence", 605}, + {"minecraft:spruce_fence_gate", 596}, + {"minecraft:spruce_hanging_sign", 222}, + {"minecraft:spruce_leaves", 89}, + {"minecraft:spruce_log", 50}, + {"minecraft:spruce_planks", 14}, + {"minecraft:spruce_pressure_plate", 249}, + {"minecraft:spruce_sapling", 26}, + {"minecraft:spruce_sign", 198}, + {"minecraft:spruce_slab", 568}, + {"minecraft:spruce_stairs", 373}, + {"minecraft:spruce_trapdoor", 302}, + {"minecraft:spruce_wall_hanging_sign", 234}, + {"minecraft:spruce_wall_sign", 212}, + {"minecraft:spruce_wood", 72}, + {"minecraft:sticky_piston", 128}, + {"minecraft:stone", 1}, + {"minecraft:stone_brick_slab", 585}, + {"minecraft:stone_brick_stairs", 340}, + {"minecraft:stone_brick_wall", 796}, + {"minecraft:stone_bricks", 311}, + {"minecraft:stone_button", 262}, + {"minecraft:stone_pressure_plate", 246}, + {"minecraft:stone_slab", 578}, + {"minecraft:stone_stairs", 770}, + {"minecraft:stonecutter", 814}, + {"minecraft:stripped_acacia_log", 64}, + {"minecraft:stripped_acacia_wood", 83}, + {"minecraft:stripped_bamboo_block", 70}, + {"minecraft:stripped_birch_log", 62}, + {"minecraft:stripped_birch_wood", 81}, + {"minecraft:stripped_cherry_log", 65}, + {"minecraft:stripped_cherry_wood", 84}, + {"minecraft:stripped_crimson_hyphae", 833}, + {"minecraft:stripped_crimson_stem", 831}, + {"minecraft:stripped_dark_oak_log", 66}, + {"minecraft:stripped_dark_oak_wood", 85}, + {"minecraft:stripped_jungle_log", 63}, + {"minecraft:stripped_jungle_wood", 82}, + {"minecraft:stripped_mangrove_log", 69}, + {"minecraft:stripped_mangrove_wood", 87}, + {"minecraft:stripped_oak_log", 68}, + {"minecraft:stripped_oak_wood", 79}, + {"minecraft:stripped_pale_oak_log", 67}, + {"minecraft:stripped_pale_oak_wood", 86}, + {"minecraft:stripped_spruce_log", 61}, + {"minecraft:stripped_spruce_wood", 80}, + {"minecraft:stripped_warped_hyphae", 824}, + {"minecraft:stripped_warped_stem", 822}, + {"minecraft:structure_block", 864}, + {"minecraft:structure_void", 643}, + {"minecraft:sugar_cane", 269}, + {"minecraft:sunflower", 525}, + {"minecraft:suspicious_gravel", 41}, + {"minecraft:suspicious_sand", 38}, + {"minecraft:sweet_berry_bush", 820}, + {"minecraft:tall_dry_grass", 135}, + {"minecraft:tall_grass", 529}, + {"minecraft:tall_seagrass", 137}, + {"minecraft:target", 869}, + {"minecraft:terracotta", 522}, + {"minecraft:test_block", 866}, + {"minecraft:test_instance_block", 867}, + {"minecraft:tinted_glass", 958}, + {"minecraft:tnt", 176}, + {"minecraft:torch", 181}, + {"minecraft:torchflower", 158}, + {"minecraft:torchflower_crop", 630}, + {"minecraft:trapped_chest", 438}, + {"minecraft:trial_spawner", 1093}, + {"minecraft:tripwire", 371}, + {"minecraft:tripwire_hook", 370}, + {"minecraft:tube_coral", 730}, + {"minecraft:tube_coral_block", 720}, + {"minecraft:tube_coral_fan", 740}, + {"minecraft:tube_coral_wall_fan", 750}, + {"minecraft:tuff", 943}, + {"minecraft:tuff_brick_slab", 953}, + {"minecraft:tuff_brick_stairs", 954}, + {"minecraft:tuff_brick_wall", 955}, + {"minecraft:tuff_bricks", 952}, + {"minecraft:tuff_slab", 944}, + {"minecraft:tuff_stairs", 945}, + {"minecraft:tuff_wall", 946}, + {"minecraft:turtle_egg", 713}, + {"minecraft:twisting_vines", 839}, + {"minecraft:twisting_vines_plant", 840}, + {"minecraft:vault", 1094}, + {"minecraft:verdant_froglight", 1087}, + {"minecraft:vine", 335}, + {"minecraft:void_air", 761}, + {"minecraft:wall_torch", 182}, + {"minecraft:warped_button", 857}, + {"minecraft:warped_door", 859}, + {"minecraft:warped_fence", 849}, + {"minecraft:warped_fence_gate", 853}, + {"minecraft:warped_fungus", 826}, + {"minecraft:warped_hanging_sign", 230}, + {"minecraft:warped_hyphae", 823}, + {"minecraft:warped_nylium", 825}, + {"minecraft:warped_planks", 843}, + {"minecraft:warped_pressure_plate", 847}, + {"minecraft:warped_roots", 828}, + {"minecraft:warped_sign", 861}, + {"minecraft:warped_slab", 845}, + {"minecraft:warped_stairs", 855}, + {"minecraft:warped_stem", 821}, + {"minecraft:warped_trapdoor", 851}, + {"minecraft:warped_wall_hanging_sign", 243}, + {"minecraft:warped_wall_sign", 863}, + {"minecraft:warped_wart_block", 827}, + {"minecraft:water", 35}, + {"minecraft:water_cauldron", 357}, + {"minecraft:waxed_chiseled_copper", 983}, + {"minecraft:waxed_copper_block", 992}, + {"minecraft:waxed_copper_bulb", 1036}, + {"minecraft:waxed_copper_door", 1012}, + {"minecraft:waxed_copper_grate", 1028}, + {"minecraft:waxed_copper_trapdoor", 1020}, + {"minecraft:waxed_cut_copper", 999}, + {"minecraft:waxed_cut_copper_slab", 1007}, + {"minecraft:waxed_cut_copper_stairs", 1003}, + {"minecraft:waxed_exposed_chiseled_copper", 982}, + {"minecraft:waxed_exposed_copper", 994}, + {"minecraft:waxed_exposed_copper_bulb", 1037}, + {"minecraft:waxed_exposed_copper_door", 1013}, + {"minecraft:waxed_exposed_copper_grate", 1029}, + {"minecraft:waxed_exposed_copper_trapdoor", 1021}, + {"minecraft:waxed_exposed_cut_copper", 998}, + {"minecraft:waxed_exposed_cut_copper_slab", 1006}, + {"minecraft:waxed_exposed_cut_copper_stairs", 1002}, + {"minecraft:waxed_oxidized_chiseled_copper", 980}, + {"minecraft:waxed_oxidized_copper", 995}, + {"minecraft:waxed_oxidized_copper_bulb", 1039}, + {"minecraft:waxed_oxidized_copper_door", 1014}, + {"minecraft:waxed_oxidized_copper_grate", 1031}, + {"minecraft:waxed_oxidized_copper_trapdoor", 1022}, + {"minecraft:waxed_oxidized_cut_copper", 996}, + {"minecraft:waxed_oxidized_cut_copper_slab", 1004}, + {"minecraft:waxed_oxidized_cut_copper_stairs", 1000}, + {"minecraft:waxed_weathered_chiseled_copper", 981}, + {"minecraft:waxed_weathered_copper", 993}, + {"minecraft:waxed_weathered_copper_bulb", 1038}, + {"minecraft:waxed_weathered_copper_door", 1015}, + {"minecraft:waxed_weathered_copper_grate", 1030}, + {"minecraft:waxed_weathered_copper_trapdoor", 1023}, + {"minecraft:waxed_weathered_cut_copper", 997}, + {"minecraft:waxed_weathered_cut_copper_slab", 1005}, + {"minecraft:waxed_weathered_cut_copper_stairs", 1001}, + {"minecraft:weathered_chiseled_copper", 977}, + {"minecraft:weathered_copper", 968}, + {"minecraft:weathered_copper_bulb", 1034}, + {"minecraft:weathered_copper_door", 1011}, + {"minecraft:weathered_copper_grate", 1026}, + {"minecraft:weathered_copper_trapdoor", 1019}, + {"minecraft:weathered_cut_copper", 973}, + {"minecraft:weathered_cut_copper_slab", 989}, + {"minecraft:weathered_cut_copper_stairs", 985}, + {"minecraft:weeping_vines", 837}, + {"minecraft:weeping_vines_plant", 838}, + {"minecraft:wet_sponge", 100}, + {"minecraft:wheat", 194}, + {"minecraft:white_banner", 531}, + {"minecraft:white_bed", 110}, + {"minecraft:white_candle", 904}, + {"minecraft:white_candle_cake", 921}, + {"minecraft:white_carpet", 506}, + {"minecraft:white_concrete", 678}, + {"minecraft:white_concrete_powder", 694}, + {"minecraft:white_glazed_terracotta", 662}, + {"minecraft:white_shulker_box", 646}, + {"minecraft:white_stained_glass", 285}, + {"minecraft:white_stained_glass_pane", 468}, + {"minecraft:white_terracotta", 452}, + {"minecraft:white_tulip", 165}, + {"minecraft:white_wall_banner", 547}, + {"minecraft:white_wool", 140}, + {"minecraft:wildflowers", 1050}, + {"minecraft:wither_rose", 169}, + {"minecraft:wither_skeleton_skull", 423}, + {"minecraft:wither_skeleton_wall_skull", 424}, + {"minecraft:yellow_banner", 535}, + {"minecraft:yellow_bed", 114}, + {"minecraft:yellow_candle", 908}, + {"minecraft:yellow_candle_cake", 925}, + {"minecraft:yellow_carpet", 510}, + {"minecraft:yellow_concrete", 682}, + {"minecraft:yellow_concrete_powder", 698}, + {"minecraft:yellow_glazed_terracotta", 666}, + {"minecraft:yellow_shulker_box", 650}, + {"minecraft:yellow_stained_glass", 289}, + {"minecraft:yellow_stained_glass_pane", 472}, + {"minecraft:yellow_terracotta", 456}, + {"minecraft:yellow_wall_banner", 551}, + {"minecraft:yellow_wool", 144}, + {"minecraft:zombie_head", 425}, + {"minecraft:zombie_wall_head", 426}, + }; + return registry; + } + + static std::map getBlockEntityType() { + static std::map registry = { + {"minecraft:banner", 20}, + {"minecraft:barrel", 27}, + {"minecraft:beacon", 15}, + {"minecraft:bed", 25}, + {"minecraft:beehive", 34}, + {"minecraft:bell", 31}, + {"minecraft:blast_furnace", 29}, + {"minecraft:brewing_stand", 12}, + {"minecraft:brushable_block", 40}, + {"minecraft:calibrated_sculk_sensor", 36}, + {"minecraft:campfire", 33}, + {"minecraft:chest", 1}, + {"minecraft:chiseled_bookshelf", 39}, + {"minecraft:command_block", 23}, + {"minecraft:comparator", 19}, + {"minecraft:conduit", 26}, + {"minecraft:crafter", 42}, + {"minecraft:creaking_heart", 10}, + {"minecraft:daylight_detector", 17}, + {"minecraft:decorated_pot", 41}, + {"minecraft:dispenser", 5}, + {"minecraft:dropper", 6}, + {"minecraft:enchanting_table", 13}, + {"minecraft:end_gateway", 22}, + {"minecraft:end_portal", 14}, + {"minecraft:ender_chest", 3}, + {"minecraft:furnace", 0}, + {"minecraft:hanging_sign", 8}, + {"minecraft:hopper", 18}, + {"minecraft:jigsaw", 32}, + {"minecraft:jukebox", 4}, + {"minecraft:lectern", 30}, + {"minecraft:mob_spawner", 9}, + {"minecraft:piston", 11}, + {"minecraft:sculk_catalyst", 37}, + {"minecraft:sculk_sensor", 35}, + {"minecraft:sculk_shrieker", 38}, + {"minecraft:shulker_box", 24}, + {"minecraft:sign", 7}, + {"minecraft:skull", 16}, + {"minecraft:smoker", 28}, + {"minecraft:structure_block", 21}, + {"minecraft:test_block", 45}, + {"minecraft:test_instance_block", 46}, + {"minecraft:trapped_chest", 2}, + {"minecraft:trial_spawner", 43}, + {"minecraft:vault", 44}, + }; + return registry; + } + + static std::map getBlockPredicateType() { + static std::map registry = { + {"minecraft:all_of", 9}, + {"minecraft:any_of", 8}, + {"minecraft:has_sturdy_face", 3}, + {"minecraft:inside_world_bounds", 7}, + {"minecraft:matching_block_tag", 1}, + {"minecraft:matching_blocks", 0}, + {"minecraft:matching_fluids", 2}, + {"minecraft:not", 10}, + {"minecraft:replaceable", 5}, + {"minecraft:solid", 4}, + {"minecraft:true", 11}, + {"minecraft:unobstructed", 12}, + {"minecraft:would_survive", 6}, + }; + return registry; + } + + static std::map getBlockType() { + static std::map registry = { + {"minecraft:air", 1}, + {"minecraft:amethyst", 2}, + {"minecraft:amethyst_cluster", 3}, + {"minecraft:anvil", 4}, + {"minecraft:attached_stem", 5}, + {"minecraft:azalea", 6}, + {"minecraft:bamboo_sapling", 7}, + {"minecraft:bamboo_stalk", 8}, + {"minecraft:banner", 9}, + {"minecraft:barrel", 10}, + {"minecraft:barrier", 11}, + {"minecraft:base_coral_fan", 12}, + {"minecraft:base_coral_plant", 13}, + {"minecraft:base_coral_wall_fan", 14}, + {"minecraft:beacon", 15}, + {"minecraft:bed", 16}, + {"minecraft:beehive", 17}, + {"minecraft:beetroot", 18}, + {"minecraft:bell", 19}, + {"minecraft:big_dripleaf", 20}, + {"minecraft:big_dripleaf_stem", 21}, + {"minecraft:blast_furnace", 22}, + {"minecraft:block", 0}, + {"minecraft:bonemealable_feature_placer", 83}, + {"minecraft:brewing_stand", 23}, + {"minecraft:brushable", 24}, + {"minecraft:bubble_column", 25}, + {"minecraft:budding_amethyst", 26}, + {"minecraft:bush", 27}, + {"minecraft:button", 28}, + {"minecraft:cactus", 29}, + {"minecraft:cactus_flower", 30}, + {"minecraft:cake", 31}, + {"minecraft:calibrated_sculk_sensor", 32}, + {"minecraft:campfire", 33}, + {"minecraft:candle", 35}, + {"minecraft:candle_cake", 34}, + {"minecraft:carpet", 36}, + {"minecraft:carrot", 37}, + {"minecraft:cartography_table", 38}, + {"minecraft:cauldron", 39}, + {"minecraft:cave_vines", 40}, + {"minecraft:cave_vines_plant", 41}, + {"minecraft:ceiling_hanging_sign", 42}, + {"minecraft:chain", 43}, + {"minecraft:chest", 44}, + {"minecraft:chiseled_book_shelf", 45}, + {"minecraft:chorus_flower", 46}, + {"minecraft:chorus_plant", 47}, + {"minecraft:cocoa", 48}, + {"minecraft:colored_falling", 49}, + {"minecraft:command", 50}, + {"minecraft:comparator", 51}, + {"minecraft:composter", 52}, + {"minecraft:concrete_powder", 53}, + {"minecraft:conduit", 54}, + {"minecraft:copper_bulb_block", 55}, + {"minecraft:coral", 56}, + {"minecraft:coral_fan", 57}, + {"minecraft:coral_plant", 58}, + {"minecraft:coral_wall_fan", 59}, + {"minecraft:crafter", 60}, + {"minecraft:crafting_table", 61}, + {"minecraft:creaking_heart", 193}, + {"minecraft:crop", 62}, + {"minecraft:crying_obsidian", 63}, + {"minecraft:daylight_detector", 64}, + {"minecraft:decorated_pot", 66}, + {"minecraft:detector_rail", 67}, + {"minecraft:dirt_path", 68}, + {"minecraft:dispenser", 69}, + {"minecraft:door", 70}, + {"minecraft:double_plant", 71}, + {"minecraft:dragon_egg", 72}, + {"minecraft:drop_experience", 73}, + {"minecraft:dropper", 74}, + {"minecraft:dry_vegetation", 65}, + {"minecraft:enchantment_table", 75}, + {"minecraft:end_gateway", 77}, + {"minecraft:end_portal", 78}, + {"minecraft:end_portal_frame", 79}, + {"minecraft:end_rod", 80}, + {"minecraft:ender_chest", 76}, + {"minecraft:eyeblossom", 81}, + {"minecraft:farm", 82}, + {"minecraft:fence", 84}, + {"minecraft:fence_gate", 85}, + {"minecraft:fire", 86}, + {"minecraft:firefly_bush", 87}, + {"minecraft:fletching_table", 88}, + {"minecraft:flower", 89}, + {"minecraft:flower_bed", 145}, + {"minecraft:flower_pot", 90}, + {"minecraft:frogspawn", 91}, + {"minecraft:frosted_ice", 92}, + {"minecraft:fungus", 93}, + {"minecraft:furnace", 94}, + {"minecraft:glazed_terracotta", 95}, + {"minecraft:glow_lichen", 96}, + {"minecraft:grass", 97}, + {"minecraft:grindstone", 98}, + {"minecraft:half_transparent", 99}, + {"minecraft:hanging_moss", 100}, + {"minecraft:hanging_roots", 101}, + {"minecraft:hay", 102}, + {"minecraft:heavy_core", 103}, + {"minecraft:honey", 104}, + {"minecraft:hopper", 105}, + {"minecraft:huge_mushroom", 106}, + {"minecraft:ice", 107}, + {"minecraft:infested", 108}, + {"minecraft:infested_rotated_pillar", 109}, + {"minecraft:iron_bars", 110}, + {"minecraft:jack_o_lantern", 111}, + {"minecraft:jigsaw", 112}, + {"minecraft:jukebox", 113}, + {"minecraft:kelp", 114}, + {"minecraft:kelp_plant", 115}, + {"minecraft:ladder", 116}, + {"minecraft:lantern", 117}, + {"minecraft:lava_cauldron", 118}, + {"minecraft:layered_cauldron", 119}, + {"minecraft:leaf_litter", 120}, + {"minecraft:lectern", 121}, + {"minecraft:lever", 122}, + {"minecraft:light", 123}, + {"minecraft:lightning_rod", 124}, + {"minecraft:liquid", 125}, + {"minecraft:loom", 126}, + {"minecraft:magma", 127}, + {"minecraft:mangrove_leaves", 128}, + {"minecraft:mangrove_propagule", 129}, + {"minecraft:mangrove_roots", 130}, + {"minecraft:mossy_carpet", 131}, + {"minecraft:moving_piston", 132}, + {"minecraft:mud", 133}, + {"minecraft:multiface", 134}, + {"minecraft:mushroom", 135}, + {"minecraft:mycelium", 136}, + {"minecraft:nether_portal", 137}, + {"minecraft:nether_sprouts", 139}, + {"minecraft:nether_wart", 140}, + {"minecraft:netherrack", 138}, + {"minecraft:note", 141}, + {"minecraft:nylium", 142}, + {"minecraft:observer", 143}, + {"minecraft:piglinwallskull", 144}, + {"minecraft:piston_base", 146}, + {"minecraft:piston_head", 147}, + {"minecraft:pitcher_crop", 148}, + {"minecraft:player_head", 149}, + {"minecraft:player_wall_head", 150}, + {"minecraft:pointed_dripstone", 151}, + {"minecraft:potato", 152}, + {"minecraft:powder_snow", 153}, + {"minecraft:powered", 154}, + {"minecraft:powered_rail", 155}, + {"minecraft:pressure_plate", 156}, + {"minecraft:pumpkin", 157}, + {"minecraft:rail", 158}, + {"minecraft:redstone_lamp", 159}, + {"minecraft:redstone_ore", 160}, + {"minecraft:redstone_torch", 161}, + {"minecraft:redstone_wall_torch", 162}, + {"minecraft:redstone_wire", 163}, + {"minecraft:repeater", 164}, + {"minecraft:respawn_anchor", 165}, + {"minecraft:rooted_dirt", 166}, + {"minecraft:roots", 167}, + {"minecraft:rotated_pillar", 168}, + {"minecraft:sand", 170}, + {"minecraft:sapling", 169}, + {"minecraft:scaffolding", 171}, + {"minecraft:sculk", 173}, + {"minecraft:sculk_catalyst", 172}, + {"minecraft:sculk_sensor", 174}, + {"minecraft:sculk_shrieker", 175}, + {"minecraft:sculk_vein", 176}, + {"minecraft:sea_pickle", 178}, + {"minecraft:seagrass", 177}, + {"minecraft:short_dry_grass", 179}, + {"minecraft:shulker_box", 180}, + {"minecraft:skull", 181}, + {"minecraft:slab", 182}, + {"minecraft:slime", 183}, + {"minecraft:small_dripleaf", 184}, + {"minecraft:smithing_table", 185}, + {"minecraft:smoker", 186}, + {"minecraft:sniffer_egg", 187}, + {"minecraft:snow_layer", 188}, + {"minecraft:snowy_dirt", 189}, + {"minecraft:soul_fire", 190}, + {"minecraft:soul_sand", 191}, + {"minecraft:spawner", 192}, + {"minecraft:sponge", 194}, + {"minecraft:spore_blossom", 195}, + {"minecraft:stained_glass", 197}, + {"minecraft:stained_glass_pane", 196}, + {"minecraft:stair", 198}, + {"minecraft:standing_sign", 199}, + {"minecraft:stem", 200}, + {"minecraft:stonecutter", 201}, + {"minecraft:structure", 202}, + {"minecraft:structure_void", 203}, + {"minecraft:sugar_cane", 204}, + {"minecraft:sweet_berry_bush", 205}, + {"minecraft:tall_dry_grass", 206}, + {"minecraft:tall_flower", 207}, + {"minecraft:tall_grass", 208}, + {"minecraft:tall_seagrass", 209}, + {"minecraft:target", 210}, + {"minecraft:terracotta", 211}, + {"minecraft:test", 212}, + {"minecraft:test_instance", 213}, + {"minecraft:tinted_glass", 214}, + {"minecraft:tinted_particle_leaves", 215}, + {"minecraft:tnt", 216}, + {"minecraft:torch", 218}, + {"minecraft:torchflower_crop", 217}, + {"minecraft:transparent", 219}, + {"minecraft:trapdoor", 220}, + {"minecraft:trapped_chest", 221}, + {"minecraft:trial_spawner", 222}, + {"minecraft:trip_wire_hook", 223}, + {"minecraft:tripwire", 224}, + {"minecraft:turtle_egg", 225}, + {"minecraft:twisting_vines", 227}, + {"minecraft:twisting_vines_plant", 226}, + {"minecraft:untinted_particle_leaves", 228}, + {"minecraft:vault", 229}, + {"minecraft:vine", 230}, + {"minecraft:wall", 236}, + {"minecraft:wall_banner", 231}, + {"minecraft:wall_hanging_sign", 232}, + {"minecraft:wall_sign", 233}, + {"minecraft:wall_skull", 234}, + {"minecraft:wall_torch", 235}, + {"minecraft:waterlily", 237}, + {"minecraft:waterlogged_transparent", 238}, + {"minecraft:weathering_copper_bulb", 239}, + {"minecraft:weathering_copper_door", 240}, + {"minecraft:weathering_copper_full", 241}, + {"minecraft:weathering_copper_grate", 242}, + {"minecraft:weathering_copper_slab", 243}, + {"minecraft:weathering_copper_stair", 244}, + {"minecraft:weathering_copper_trap_door", 245}, + {"minecraft:web", 246}, + {"minecraft:weeping_vines", 248}, + {"minecraft:weeping_vines_plant", 247}, + {"minecraft:weighted_pressure_plate", 249}, + {"minecraft:wet_sponge", 250}, + {"minecraft:wither_rose", 251}, + {"minecraft:wither_skull", 252}, + {"minecraft:wither_wall_skull", 253}, + {"minecraft:wool_carpet", 254}, + }; + return registry; + } + + static std::map getChunkStatus() { + static std::map registry = { + {"minecraft:biomes", 3}, + {"minecraft:carvers", 6}, + {"minecraft:empty", 0}, + {"minecraft:features", 7}, + {"minecraft:full", 11}, + {"minecraft:initialize_light", 8}, + {"minecraft:light", 9}, + {"minecraft:noise", 4}, + {"minecraft:spawn", 10}, + {"minecraft:structure_references", 2}, + {"minecraft:structure_starts", 1}, + {"minecraft:surface", 5}, + }; + return registry; + } + + static std::map getCommandArgumentType() { + static std::map registry = { + {"brigadier:bool", 0}, + {"brigadier:double", 2}, + {"brigadier:float", 1}, + {"brigadier:integer", 3}, + {"brigadier:long", 4}, + {"brigadier:string", 5}, + {"minecraft:angle", 27}, + {"minecraft:block_pos", 8}, + {"minecraft:block_predicate", 13}, + {"minecraft:block_state", 12}, + {"minecraft:color", 16}, + {"minecraft:column_pos", 9}, + {"minecraft:component", 17}, + {"minecraft:dimension", 40}, + {"minecraft:entity", 6}, + {"minecraft:entity_anchor", 37}, + {"minecraft:float_range", 39}, + {"minecraft:function", 36}, + {"minecraft:game_profile", 7}, + {"minecraft:gamemode", 41}, + {"minecraft:heightmap", 50}, + {"minecraft:int_range", 38}, + {"minecraft:item_predicate", 15}, + {"minecraft:item_slot", 33}, + {"minecraft:item_slots", 34}, + {"minecraft:item_stack", 14}, + {"minecraft:loot_modifier", 53}, + {"minecraft:loot_predicate", 52}, + {"minecraft:loot_table", 51}, + {"minecraft:message", 19}, + {"minecraft:nbt_compound_tag", 20}, + {"minecraft:nbt_path", 22}, + {"minecraft:nbt_tag", 21}, + {"minecraft:objective", 23}, + {"minecraft:objective_criteria", 24}, + {"minecraft:operation", 25}, + {"minecraft:particle", 26}, + {"minecraft:resource", 45}, + {"minecraft:resource_key", 46}, + {"minecraft:resource_location", 35}, + {"minecraft:resource_or_tag", 43}, + {"minecraft:resource_or_tag_key", 44}, + {"minecraft:resource_selector", 47}, + {"minecraft:rotation", 28}, + {"minecraft:score_holder", 30}, + {"minecraft:scoreboard_slot", 29}, + {"minecraft:style", 18}, + {"minecraft:swizzle", 31}, + {"minecraft:team", 32}, + {"minecraft:template_mirror", 48}, + {"minecraft:template_rotation", 49}, + {"minecraft:time", 42}, + {"minecraft:uuid", 54}, + {"minecraft:vec2", 11}, + {"minecraft:vec3", 10}, + }; + return registry; + } + + static std::map getConsumeEffectType() { + static std::map registry = { + {"minecraft:apply_effects", 0}, + {"minecraft:clear_all_effects", 2}, + {"minecraft:play_sound", 4}, + {"minecraft:remove_effects", 1}, + {"minecraft:teleport_randomly", 3}, + }; + return registry; + } + + static std::map getCreativeModeTab() { + static std::map registry = { + {"minecraft:building_blocks", 0}, + {"minecraft:colored_blocks", 1}, + {"minecraft:combat", 8}, + {"minecraft:food_and_drinks", 9}, + {"minecraft:functional_blocks", 3}, + {"minecraft:hotbar", 5}, + {"minecraft:ingredients", 10}, + {"minecraft:inventory", 13}, + {"minecraft:natural_blocks", 2}, + {"minecraft:op_blocks", 12}, + {"minecraft:redstone_blocks", 4}, + {"minecraft:search", 6}, + {"minecraft:spawn_eggs", 11}, + {"minecraft:tools_and_utilities", 7}, + }; + return registry; + } + + static std::map getCustomStat() { + static std::map registry = { + {"minecraft:animals_bred", 32}, + {"minecraft:aviate_one_cm", 18}, + {"minecraft:bell_ring", 68}, + {"minecraft:boat_one_cm", 15}, + {"minecraft:clean_armor", 40}, + {"minecraft:clean_banner", 41}, + {"minecraft:clean_shulker_box", 42}, + {"minecraft:climb_one_cm", 11}, + {"minecraft:crouch_one_cm", 7}, + {"minecraft:damage_absorbed", 28}, + {"minecraft:damage_blocked_by_shield", 27}, + {"minecraft:damage_dealt", 23}, + {"minecraft:damage_dealt_absorbed", 24}, + {"minecraft:damage_dealt_resisted", 25}, + {"minecraft:damage_resisted", 29}, + {"minecraft:damage_taken", 26}, + {"minecraft:deaths", 30}, + {"minecraft:drop", 22}, + {"minecraft:eat_cake_slice", 37}, + {"minecraft:enchant_item", 53}, + {"minecraft:fall_one_cm", 10}, + {"minecraft:fill_cauldron", 38}, + {"minecraft:fish_caught", 34}, + {"minecraft:fly_one_cm", 12}, + {"minecraft:horse_one_cm", 17}, + {"minecraft:inspect_dispenser", 47}, + {"minecraft:inspect_dropper", 45}, + {"minecraft:inspect_hopper", 46}, + {"minecraft:interact_with_anvil", 71}, + {"minecraft:interact_with_beacon", 44}, + {"minecraft:interact_with_blast_furnace", 61}, + {"minecraft:interact_with_brewingstand", 43}, + {"minecraft:interact_with_campfire", 64}, + {"minecraft:interact_with_cartography_table", 65}, + {"minecraft:interact_with_crafting_table", 56}, + {"minecraft:interact_with_furnace", 55}, + {"minecraft:interact_with_grindstone", 72}, + {"minecraft:interact_with_lectern", 63}, + {"minecraft:interact_with_loom", 66}, + {"minecraft:interact_with_smithing_table", 74}, + {"minecraft:interact_with_smoker", 62}, + {"minecraft:interact_with_stonecutter", 67}, + {"minecraft:jump", 21}, + {"minecraft:leave_game", 0}, + {"minecraft:minecart_one_cm", 14}, + {"minecraft:mob_kills", 31}, + {"minecraft:open_barrel", 60}, + {"minecraft:open_chest", 57}, + {"minecraft:open_enderchest", 52}, + {"minecraft:open_shulker_box", 59}, + {"minecraft:pig_one_cm", 16}, + {"minecraft:play_noteblock", 48}, + {"minecraft:play_record", 54}, + {"minecraft:play_time", 1}, + {"minecraft:player_kills", 33}, + {"minecraft:pot_flower", 50}, + {"minecraft:raid_trigger", 69}, + {"minecraft:raid_win", 70}, + {"minecraft:sleep_in_bed", 58}, + {"minecraft:sneak_time", 5}, + {"minecraft:sprint_one_cm", 8}, + {"minecraft:strider_one_cm", 20}, + {"minecraft:swim_one_cm", 19}, + {"minecraft:talked_to_villager", 35}, + {"minecraft:target_hit", 73}, + {"minecraft:time_since_death", 3}, + {"minecraft:time_since_rest", 4}, + {"minecraft:total_world_time", 2}, + {"minecraft:traded_with_villager", 36}, + {"minecraft:trigger_trapped_chest", 51}, + {"minecraft:tune_noteblock", 49}, + {"minecraft:use_cauldron", 39}, + {"minecraft:walk_on_water_one_cm", 9}, + {"minecraft:walk_one_cm", 6}, + {"minecraft:walk_under_water_one_cm", 13}, + }; + return registry; + } + + static std::map getDataComponentPredicateType() { + static std::map registry = { + {"minecraft:attribute_modifiers", 11}, + {"minecraft:bundle_contents", 6}, + {"minecraft:container", 5}, + {"minecraft:custom_data", 4}, + {"minecraft:damage", 0}, + {"minecraft:enchantments", 1}, + {"minecraft:firework_explosion", 7}, + {"minecraft:fireworks", 8}, + {"minecraft:jukebox_playable", 13}, + {"minecraft:potion_contents", 3}, + {"minecraft:stored_enchantments", 2}, + {"minecraft:trim", 12}, + {"minecraft:writable_book_content", 9}, + {"minecraft:written_book_content", 10}, + }; + return registry; + } + + static std::map getDataComponentType() { + static std::map registry = { + {"minecraft:attribute_modifiers", 13}, + {"minecraft:axolotl/variant", 91}, + {"minecraft:banner_patterns", 63}, + {"minecraft:base_color", 64}, + {"minecraft:bees", 68}, + {"minecraft:block_entity_data", 51}, + {"minecraft:block_state", 67}, + {"minecraft:blocks_attacks", 33}, + {"minecraft:break_sound", 71}, + {"minecraft:bucket_entity_data", 50}, + {"minecraft:bundle_contents", 41}, + {"minecraft:can_break", 12}, + {"minecraft:can_place_on", 11}, + {"minecraft:cat/collar", 93}, + {"minecraft:cat/variant", 92}, + {"minecraft:charged_projectiles", 40}, + {"minecraft:chicken/variant", 86}, + {"minecraft:consumable", 21}, + {"minecraft:container", 66}, + {"minecraft:container_loot", 70}, + {"minecraft:cow/variant", 85}, + {"minecraft:creative_slot_lock", 17}, + {"minecraft:custom_data", 0}, + {"minecraft:custom_model_data", 14}, + {"minecraft:custom_name", 5}, + {"minecraft:damage", 3}, + {"minecraft:damage_resistant", 24}, + {"minecraft:death_protection", 32}, + {"minecraft:debug_stick_state", 48}, + {"minecraft:dyed_color", 35}, + {"minecraft:enchantable", 27}, + {"minecraft:enchantment_glint_override", 18}, + {"minecraft:enchantments", 10}, + {"minecraft:entity_data", 49}, + {"minecraft:equippable", 28}, + {"minecraft:firework_explosion", 59}, + {"minecraft:fireworks", 60}, + {"minecraft:food", 20}, + {"minecraft:fox/variant", 76}, + {"minecraft:frog/variant", 87}, + {"minecraft:glider", 30}, + {"minecraft:horse/variant", 88}, + {"minecraft:instrument", 52}, + {"minecraft:intangible_projectile", 19}, + {"minecraft:item_model", 7}, + {"minecraft:item_name", 6}, + {"minecraft:jukebox_playable", 55}, + {"minecraft:llama/variant", 90}, + {"minecraft:lock", 69}, + {"minecraft:lodestone_tracker", 58}, + {"minecraft:lore", 8}, + {"minecraft:map_color", 36}, + {"minecraft:map_decorations", 38}, + {"minecraft:map_id", 37}, + {"minecraft:map_post_processing", 39}, + {"minecraft:max_damage", 2}, + {"minecraft:max_stack_size", 1}, + {"minecraft:mooshroom/variant", 82}, + {"minecraft:note_block_sound", 62}, + {"minecraft:ominous_bottle_amplifier", 54}, + {"minecraft:painting/variant", 89}, + {"minecraft:parrot/variant", 78}, + {"minecraft:pig/variant", 84}, + {"minecraft:pot_decorations", 65}, + {"minecraft:potion_contents", 42}, + {"minecraft:potion_duration_scale", 43}, + {"minecraft:profile", 61}, + {"minecraft:provides_banner_patterns", 56}, + {"minecraft:provides_trim_material", 53}, + {"minecraft:rabbit/variant", 83}, + {"minecraft:rarity", 9}, + {"minecraft:recipes", 57}, + {"minecraft:repair_cost", 16}, + {"minecraft:repairable", 29}, + {"minecraft:salmon/size", 77}, + {"minecraft:sheep/color", 94}, + {"minecraft:shulker/color", 95}, + {"minecraft:stored_enchantments", 34}, + {"minecraft:suspicious_stew_effects", 44}, + {"minecraft:tool", 25}, + {"minecraft:tooltip_display", 15}, + {"minecraft:tooltip_style", 31}, + {"minecraft:trim", 47}, + {"minecraft:tropical_fish/base_color", 80}, + {"minecraft:tropical_fish/pattern", 79}, + {"minecraft:tropical_fish/pattern_color", 81}, + {"minecraft:unbreakable", 4}, + {"minecraft:use_cooldown", 23}, + {"minecraft:use_remainder", 22}, + {"minecraft:villager/variant", 72}, + {"minecraft:weapon", 26}, + {"minecraft:wolf/collar", 75}, + {"minecraft:wolf/sound_variant", 74}, + {"minecraft:wolf/variant", 73}, + {"minecraft:writable_book_content", 45}, + {"minecraft:written_book_content", 46}, + }; + return registry; + } + + static std::map getDecoratedPotPattern() { + static std::map registry = { + {"minecraft:angler", 0}, {"minecraft:archer", 1}, {"minecraft:arms_up", 2}, {"minecraft:blade", 3}, {"minecraft:blank", 23}, + {"minecraft:brewer", 4}, {"minecraft:burn", 5}, {"minecraft:danger", 6}, {"minecraft:explorer", 7}, {"minecraft:flow", 8}, + {"minecraft:friend", 9}, {"minecraft:guster", 10}, {"minecraft:heart", 11}, {"minecraft:heartbreak", 12}, {"minecraft:howl", 13}, + {"minecraft:miner", 14}, {"minecraft:mourner", 15}, {"minecraft:plenty", 16}, {"minecraft:prize", 17}, {"minecraft:scrape", 18}, + {"minecraft:sheaf", 19}, {"minecraft:shelter", 20}, {"minecraft:skull", 21}, {"minecraft:snort", 22}, + }; + return registry; + } + + static std::map getEnchantmentEffectComponentType() { + static std::map registry = { + {"minecraft:ammo_use", 13}, + {"minecraft:armor_effectiveness", 5}, + {"minecraft:attributes", 9}, + {"minecraft:block_experience", 21}, + {"minecraft:crossbow_charge_time", 24}, + {"minecraft:crossbow_charging_sounds", 25}, + {"minecraft:damage", 2}, + {"minecraft:damage_immunity", 1}, + {"minecraft:damage_protection", 0}, + {"minecraft:equipment_drops", 10}, + {"minecraft:fishing_luck_bonus", 20}, + {"minecraft:fishing_time_reduction", 19}, + {"minecraft:hit_block", 7}, + {"minecraft:item_damage", 8}, + {"minecraft:knockback", 4}, + {"minecraft:location_changed", 11}, + {"minecraft:mob_experience", 22}, + {"minecraft:post_attack", 6}, + {"minecraft:prevent_armor_change", 28}, + {"minecraft:prevent_equipment_drop", 27}, + {"minecraft:projectile_count", 17}, + {"minecraft:projectile_piercing", 14}, + {"minecraft:projectile_spawned", 15}, + {"minecraft:projectile_spread", 16}, + {"minecraft:repair_with_xp", 23}, + {"minecraft:smash_damage_per_fallen_block", 3}, + {"minecraft:tick", 12}, + {"minecraft:trident_return_acceleration", 18}, + {"minecraft:trident_sound", 26}, + {"minecraft:trident_spin_attack_strength", 29}, + }; + return registry; + } + + static std::map getEnchantmentEntityEffectType() { + static std::map registry = { + {"minecraft:all_of", 0}, + {"minecraft:apply_mob_effect", 1}, + {"minecraft:change_item_damage", 2}, + {"minecraft:damage_entity", 3}, + {"minecraft:explode", 4}, + {"minecraft:ignite", 5}, + {"minecraft:play_sound", 6}, + {"minecraft:replace_block", 7}, + {"minecraft:replace_disk", 8}, + {"minecraft:run_function", 9}, + {"minecraft:set_block_properties", 10}, + {"minecraft:spawn_particles", 11}, + {"minecraft:summon_entity", 12}, + }; + return registry; + } + + static std::map getEnchantmentLevelBasedValueType() { + static std::map registry = { + {"minecraft:clamped", 0}, + {"minecraft:fraction", 1}, + {"minecraft:levels_squared", 2}, + {"minecraft:linear", 3}, + {"minecraft:lookup", 4}, + }; + return registry; + } + + static std::map getEnchantmentLocationBasedEffectType() { + static std::map registry = { + {"minecraft:all_of", 0}, + {"minecraft:apply_mob_effect", 1}, + {"minecraft:attribute", 2}, + {"minecraft:change_item_damage", 3}, + {"minecraft:damage_entity", 4}, + {"minecraft:explode", 5}, + {"minecraft:ignite", 6}, + {"minecraft:play_sound", 7}, + {"minecraft:replace_block", 8}, + {"minecraft:replace_disk", 9}, + {"minecraft:run_function", 10}, + {"minecraft:set_block_properties", 11}, + {"minecraft:spawn_particles", 12}, + {"minecraft:summon_entity", 13}, + }; + return registry; + } + + static std::map getEnchantmentProviderType() { + static std::map registry = { + {"minecraft:by_cost", 0}, + {"minecraft:by_cost_with_difficulty", 1}, + {"minecraft:single", 2}, + }; + return registry; + } + + static std::map getEnchantmentValueEffectType() { + static std::map registry = { + {"minecraft:add", 0}, + {"minecraft:all_of", 1}, + {"minecraft:multiply", 2}, + {"minecraft:remove_binomial", 3}, + {"minecraft:set", 4}, + }; + return registry; + } + + static std::map getEntitySubPredicateType() { + static std::map registry = { + {"minecraft:fishing_hook", 1}, + {"minecraft:lightning", 0}, + {"minecraft:player", 2}, + {"minecraft:raider", 4}, + {"minecraft:sheep", 5}, + {"minecraft:slime", 3}, + }; + return registry; + } + + static std::map getEntityType() { + static std::map registry = { + {"minecraft:acacia_boat", 0}, + {"minecraft:acacia_chest_boat", 1}, + {"minecraft:allay", 2}, + {"minecraft:area_effect_cloud", 3}, + {"minecraft:armadillo", 4}, + {"minecraft:armor_stand", 5}, + {"minecraft:arrow", 6}, + {"minecraft:axolotl", 7}, + {"minecraft:bamboo_chest_raft", 8}, + {"minecraft:bamboo_raft", 9}, + {"minecraft:bat", 10}, + {"minecraft:bee", 11}, + {"minecraft:birch_boat", 12}, + {"minecraft:birch_chest_boat", 13}, + {"minecraft:blaze", 14}, + {"minecraft:block_display", 15}, + {"minecraft:bogged", 16}, + {"minecraft:breeze", 17}, + {"minecraft:breeze_wind_charge", 18}, + {"minecraft:camel", 19}, + {"minecraft:cat", 20}, + {"minecraft:cave_spider", 21}, + {"minecraft:cherry_boat", 22}, + {"minecraft:cherry_chest_boat", 23}, + {"minecraft:chest_minecart", 24}, + {"minecraft:chicken", 25}, + {"minecraft:cod", 26}, + {"minecraft:command_block_minecart", 27}, + {"minecraft:cow", 28}, + {"minecraft:creaking", 29}, + {"minecraft:creeper", 30}, + {"minecraft:dark_oak_boat", 31}, + {"minecraft:dark_oak_chest_boat", 32}, + {"minecraft:dolphin", 33}, + {"minecraft:donkey", 34}, + {"minecraft:dragon_fireball", 35}, + {"minecraft:drowned", 36}, + {"minecraft:egg", 37}, + {"minecraft:elder_guardian", 38}, + {"minecraft:end_crystal", 43}, + {"minecraft:ender_dragon", 41}, + {"minecraft:ender_pearl", 42}, + {"minecraft:enderman", 39}, + {"minecraft:endermite", 40}, + {"minecraft:evoker", 44}, + {"minecraft:evoker_fangs", 45}, + {"minecraft:experience_bottle", 46}, + {"minecraft:experience_orb", 47}, + {"minecraft:eye_of_ender", 48}, + {"minecraft:falling_block", 49}, + {"minecraft:fireball", 50}, + {"minecraft:firework_rocket", 51}, + {"minecraft:fishing_bobber", 149}, + {"minecraft:fox", 52}, + {"minecraft:frog", 53}, + {"minecraft:furnace_minecart", 54}, + {"minecraft:ghast", 55}, + {"minecraft:giant", 56}, + {"minecraft:glow_item_frame", 57}, + {"minecraft:glow_squid", 58}, + {"minecraft:goat", 59}, + {"minecraft:guardian", 60}, + {"minecraft:hoglin", 61}, + {"minecraft:hopper_minecart", 62}, + {"minecraft:horse", 63}, + {"minecraft:husk", 64}, + {"minecraft:illusioner", 65}, + {"minecraft:interaction", 66}, + {"minecraft:iron_golem", 67}, + {"minecraft:item", 68}, + {"minecraft:item_display", 69}, + {"minecraft:item_frame", 70}, + {"minecraft:jungle_boat", 71}, + {"minecraft:jungle_chest_boat", 72}, + {"minecraft:leash_knot", 73}, + {"minecraft:lightning_bolt", 74}, + {"minecraft:lingering_potion", 100}, + {"minecraft:llama", 75}, + {"minecraft:llama_spit", 76}, + {"minecraft:magma_cube", 77}, + {"minecraft:mangrove_boat", 78}, + {"minecraft:mangrove_chest_boat", 79}, + {"minecraft:marker", 80}, + {"minecraft:minecart", 81}, + {"minecraft:mooshroom", 82}, + {"minecraft:mule", 83}, + {"minecraft:oak_boat", 84}, + {"minecraft:oak_chest_boat", 85}, + {"minecraft:ocelot", 86}, + {"minecraft:ominous_item_spawner", 87}, + {"minecraft:painting", 88}, + {"minecraft:pale_oak_boat", 89}, + {"minecraft:pale_oak_chest_boat", 90}, + {"minecraft:panda", 91}, + {"minecraft:parrot", 92}, + {"minecraft:phantom", 93}, + {"minecraft:pig", 94}, + {"minecraft:piglin", 95}, + {"minecraft:piglin_brute", 96}, + {"minecraft:pillager", 97}, + {"minecraft:player", 148}, + {"minecraft:polar_bear", 98}, + {"minecraft:pufferfish", 101}, + {"minecraft:rabbit", 102}, + {"minecraft:ravager", 103}, + {"minecraft:salmon", 104}, + {"minecraft:sheep", 105}, + {"minecraft:shulker", 106}, + {"minecraft:shulker_bullet", 107}, + {"minecraft:silverfish", 108}, + {"minecraft:skeleton", 109}, + {"minecraft:skeleton_horse", 110}, + {"minecraft:slime", 111}, + {"minecraft:small_fireball", 112}, + {"minecraft:sniffer", 113}, + {"minecraft:snow_golem", 115}, + {"minecraft:snowball", 114}, + {"minecraft:spawner_minecart", 116}, + {"minecraft:spectral_arrow", 117}, + {"minecraft:spider", 118}, + {"minecraft:splash_potion", 99}, + {"minecraft:spruce_boat", 119}, + {"minecraft:spruce_chest_boat", 120}, + {"minecraft:squid", 121}, + {"minecraft:stray", 122}, + {"minecraft:strider", 123}, + {"minecraft:tadpole", 124}, + {"minecraft:text_display", 125}, + {"minecraft:tnt", 126}, + {"minecraft:tnt_minecart", 127}, + {"minecraft:trader_llama", 128}, + {"minecraft:trident", 129}, + {"minecraft:tropical_fish", 130}, + {"minecraft:turtle", 131}, + {"minecraft:vex", 132}, + {"minecraft:villager", 133}, + {"minecraft:vindicator", 134}, + {"minecraft:wandering_trader", 135}, + {"minecraft:warden", 136}, + {"minecraft:wind_charge", 137}, + {"minecraft:witch", 138}, + {"minecraft:wither", 139}, + {"minecraft:wither_skeleton", 140}, + {"minecraft:wither_skull", 141}, + {"minecraft:wolf", 142}, + {"minecraft:zoglin", 143}, + {"minecraft:zombie", 144}, + {"minecraft:zombie_horse", 145}, + {"minecraft:zombie_villager", 146}, + {"minecraft:zombified_piglin", 147}, + }; + return registry; + } + + static std::map getFloatProviderType() { + static std::map registry = { + {"minecraft:clamped_normal", 2}, + {"minecraft:constant", 0}, + {"minecraft:trapezoid", 3}, + {"minecraft:uniform", 1}, + }; + return registry; + } + + static std::map getFluid() { + static std::map registry = { + {"minecraft:empty", 0}, + {"minecraft:flowing_lava", 3}, + {"minecraft:flowing_water", 1}, + {"minecraft:lava", 4}, + {"minecraft:water", 2}, + }; + return registry; + } + + static std::map getGameEvent() { + static std::map registry = { + {"minecraft:block_activate", 0}, + {"minecraft:block_attach", 1}, + {"minecraft:block_change", 2}, + {"minecraft:block_close", 3}, + {"minecraft:block_deactivate", 4}, + {"minecraft:block_destroy", 5}, + {"minecraft:block_detach", 6}, + {"minecraft:block_open", 7}, + {"minecraft:block_place", 8}, + {"minecraft:container_close", 9}, + {"minecraft:container_open", 10}, + {"minecraft:drink", 11}, + {"minecraft:eat", 12}, + {"minecraft:elytra_glide", 13}, + {"minecraft:entity_action", 20}, + {"minecraft:entity_damage", 14}, + {"minecraft:entity_die", 15}, + {"minecraft:entity_dismount", 16}, + {"minecraft:entity_interact", 17}, + {"minecraft:entity_mount", 18}, + {"minecraft:entity_place", 19}, + {"minecraft:equip", 21}, + {"minecraft:explode", 22}, + {"minecraft:flap", 23}, + {"minecraft:fluid_pickup", 24}, + {"minecraft:fluid_place", 25}, + {"minecraft:hit_ground", 26}, + {"minecraft:instrument_play", 27}, + {"minecraft:item_interact_finish", 28}, + {"minecraft:item_interact_start", 29}, + {"minecraft:jukebox_play", 30}, + {"minecraft:jukebox_stop_play", 31}, + {"minecraft:lightning_strike", 32}, + {"minecraft:note_block_play", 33}, + {"minecraft:prime_fuse", 34}, + {"minecraft:projectile_land", 35}, + {"minecraft:projectile_shoot", 36}, + {"minecraft:resonate_1", 45}, + {"minecraft:resonate_10", 54}, + {"minecraft:resonate_11", 55}, + {"minecraft:resonate_12", 56}, + {"minecraft:resonate_13", 57}, + {"minecraft:resonate_14", 58}, + {"minecraft:resonate_15", 59}, + {"minecraft:resonate_2", 46}, + {"minecraft:resonate_3", 47}, + {"minecraft:resonate_4", 48}, + {"minecraft:resonate_5", 49}, + {"minecraft:resonate_6", 50}, + {"minecraft:resonate_7", 51}, + {"minecraft:resonate_8", 52}, + {"minecraft:resonate_9", 53}, + {"minecraft:sculk_sensor_tendrils_clicking", 37}, + {"minecraft:shear", 38}, + {"minecraft:shriek", 39}, + {"minecraft:splash", 40}, + {"minecraft:step", 41}, + {"minecraft:swim", 42}, + {"minecraft:teleport", 43}, + {"minecraft:unequip", 44}, + }; + return registry; + } + + static std::map getHeightProviderType() { + static std::map registry = { + {"minecraft:biased_to_bottom", 2}, + {"minecraft:constant", 0}, + {"minecraft:trapezoid", 4}, + {"minecraft:uniform", 1}, + {"minecraft:very_biased_to_bottom", 3}, + {"minecraft:weighted_list", 5}, + }; + return registry; + } + + static std::map getIntProviderType() { + static std::map registry = { + {"minecraft:biased_to_bottom", 2}, + {"minecraft:clamped", 3}, + {"minecraft:clamped_normal", 5}, + {"minecraft:constant", 0}, + {"minecraft:uniform", 1}, + {"minecraft:weighted_list", 4}, + }; + return registry; + } + + static std::map getItem() { + static std::map registry = { + {"minecraft:acacia_boat", 818}, + {"minecraft:acacia_button", 718}, + {"minecraft:acacia_chest_boat", 819}, + {"minecraft:acacia_door", 747}, + {"minecraft:acacia_fence", 336}, + {"minecraft:acacia_fence_gate", 788}, + {"minecraft:acacia_hanging_sign", 942}, + {"minecraft:acacia_leaves", 186}, + {"minecraft:acacia_log", 138}, + {"minecraft:acacia_planks", 40}, + {"minecraft:acacia_pressure_plate", 734}, + {"minecraft:acacia_sapling", 53}, + {"minecraft:acacia_sign", 930}, + {"minecraft:acacia_slab", 274}, + {"minecraft:acacia_stairs", 416}, + {"minecraft:acacia_trapdoor", 768}, + {"minecraft:acacia_wood", 175}, + {"minecraft:activator_rail", 799}, + {"minecraft:air", 0}, + {"minecraft:allay_spawn_egg", 1069}, + {"minecraft:allium", 234}, + {"minecraft:amethyst_block", 88}, + {"minecraft:amethyst_cluster", 1325}, + {"minecraft:amethyst_shard", 849}, + {"minecraft:ancient_debris", 82}, + {"minecraft:andesite", 6}, + {"minecraft:andesite_slab", 678}, + {"minecraft:andesite_stairs", 661}, + {"minecraft:andesite_wall", 437}, + {"minecraft:angler_pottery_sherd", 1352}, + {"minecraft:anvil", 449}, + {"minecraft:apple", 840}, + {"minecraft:archer_pottery_sherd", 1353}, + {"minecraft:armadillo_scute", 836}, + {"minecraft:armadillo_spawn_egg", 1068}, + {"minecraft:armor_stand", 1186}, + {"minecraft:arms_up_pottery_sherd", 1354}, + {"minecraft:arrow", 842}, + {"minecraft:axolotl_bucket", 961}, + {"minecraft:axolotl_spawn_egg", 1070}, + {"minecraft:azalea", 205}, + {"minecraft:azalea_leaves", 191}, + {"minecraft:azure_bluet", 235}, + {"minecraft:baked_potato", 1161}, + {"minecraft:bamboo", 269}, + {"minecraft:bamboo_block", 147}, + {"minecraft:bamboo_button", 723}, + {"minecraft:bamboo_chest_raft", 829}, + {"minecraft:bamboo_door", 752}, + {"minecraft:bamboo_fence", 341}, + {"minecraft:bamboo_fence_gate", 793}, + {"minecraft:bamboo_hanging_sign", 947}, + {"minecraft:bamboo_mosaic", 48}, + {"minecraft:bamboo_mosaic_slab", 280}, + {"minecraft:bamboo_mosaic_stairs", 422}, + {"minecraft:bamboo_planks", 45}, + {"minecraft:bamboo_pressure_plate", 739}, + {"minecraft:bamboo_raft", 828}, + {"minecraft:bamboo_sign", 935}, + {"minecraft:bamboo_slab", 279}, + {"minecraft:bamboo_stairs", 421}, + {"minecraft:bamboo_trapdoor", 773}, + {"minecraft:barrel", 1269}, + {"minecraft:barrier", 473}, + {"minecraft:basalt", 350}, + {"minecraft:bat_spawn_egg", 1071}, + {"minecraft:beacon", 426}, + {"minecraft:bedrock", 58}, + {"minecraft:bee_nest", 1286}, + {"minecraft:bee_spawn_egg", 1072}, + {"minecraft:beef", 1048}, + {"minecraft:beehive", 1287}, + {"minecraft:beetroot", 1217}, + {"minecraft:beetroot_seeds", 1218}, + {"minecraft:beetroot_soup", 1219}, + {"minecraft:bell", 1277}, + {"minecraft:big_dripleaf", 267}, + {"minecraft:birch_boat", 814}, + {"minecraft:birch_button", 716}, + {"minecraft:birch_chest_boat", 815}, + {"minecraft:birch_door", 745}, + {"minecraft:birch_fence", 334}, + {"minecraft:birch_fence_gate", 786}, + {"minecraft:birch_hanging_sign", 940}, + {"minecraft:birch_leaves", 184}, + {"minecraft:birch_log", 136}, + {"minecraft:birch_planks", 38}, + {"minecraft:birch_pressure_plate", 732}, + {"minecraft:birch_sapling", 51}, + {"minecraft:birch_sign", 928}, + {"minecraft:birch_slab", 272}, + {"minecraft:birch_stairs", 414}, + {"minecraft:birch_trapdoor", 766}, + {"minecraft:birch_wood", 173}, + {"minecraft:black_banner", 1211}, + {"minecraft:black_bed", 1039}, + {"minecraft:black_bundle", 990}, + {"minecraft:black_candle", 1321}, + {"minecraft:black_carpet", 491}, + {"minecraft:black_concrete", 600}, + {"minecraft:black_concrete_powder", 616}, + {"minecraft:black_dye", 1019}, + {"minecraft:black_glazed_terracotta", 584}, + {"minecraft:black_shulker_box", 568}, + {"minecraft:black_stained_glass", 516}, + {"minecraft:black_stained_glass_pane", 532}, + {"minecraft:black_terracotta", 472}, + {"minecraft:black_wool", 228}, + {"minecraft:blackstone", 1292}, + {"minecraft:blackstone_slab", 1293}, + {"minecraft:blackstone_stairs", 1294}, + {"minecraft:blackstone_wall", 442}, + {"minecraft:blade_pottery_sherd", 1355}, + {"minecraft:blast_furnace", 1271}, + {"minecraft:blaze_powder", 1062}, + {"minecraft:blaze_rod", 1054}, + {"minecraft:blaze_spawn_egg", 1073}, + {"minecraft:blue_banner", 1207}, + {"minecraft:blue_bed", 1035}, + {"minecraft:blue_bundle", 986}, + {"minecraft:blue_candle", 1317}, + {"minecraft:blue_carpet", 487}, + {"minecraft:blue_concrete", 596}, + {"minecraft:blue_concrete_powder", 612}, + {"minecraft:blue_dye", 1015}, + {"minecraft:blue_egg", 970}, + {"minecraft:blue_glazed_terracotta", 580}, + {"minecraft:blue_ice", 649}, + {"minecraft:blue_orchid", 233}, + {"minecraft:blue_shulker_box", 564}, + {"minecraft:blue_stained_glass", 512}, + {"minecraft:blue_stained_glass_pane", 528}, + {"minecraft:blue_terracotta", 468}, + {"minecraft:blue_wool", 224}, + {"minecraft:bogged_spawn_egg", 1074}, + {"minecraft:bolt_armor_trim_smithing_template", 1351}, + {"minecraft:bone", 1021}, + {"minecraft:bone_block", 550}, + {"minecraft:bone_meal", 1020}, + {"minecraft:book", 967}, + {"minecraft:bookshelf", 305}, + {"minecraft:bordure_indented_banner_pattern", 1266}, + {"minecraft:bow", 841}, + {"minecraft:bowl", 839}, + {"minecraft:brain_coral", 630}, + {"minecraft:brain_coral_block", 625}, + {"minecraft:brain_coral_fan", 640}, + {"minecraft:bread", 895}, + {"minecraft:breeze_rod", 1154}, + {"minecraft:breeze_spawn_egg", 1075}, + {"minecraft:brewer_pottery_sherd", 1356}, + {"minecraft:brewing_stand", 1064}, + {"minecraft:brick", 963}, + {"minecraft:brick_slab", 289}, + {"minecraft:brick_stairs", 390}, + {"minecraft:brick_wall", 429}, + {"minecraft:bricks", 304}, + {"minecraft:brown_banner", 1208}, + {"minecraft:brown_bed", 1036}, + {"minecraft:brown_bundle", 987}, + {"minecraft:brown_candle", 1318}, + {"minecraft:brown_carpet", 488}, + {"minecraft:brown_concrete", 597}, + {"minecraft:brown_concrete_powder", 613}, + {"minecraft:brown_dye", 1016}, + {"minecraft:brown_egg", 971}, + {"minecraft:brown_glazed_terracotta", 581}, + {"minecraft:brown_mushroom", 247}, + {"minecraft:brown_mushroom_block", 374}, + {"minecraft:brown_shulker_box", 565}, + {"minecraft:brown_stained_glass", 513}, + {"minecraft:brown_stained_glass_pane", 529}, + {"minecraft:brown_terracotta", 469}, + {"minecraft:brown_wool", 225}, + {"minecraft:brush", 1332}, + {"minecraft:bubble_coral", 631}, + {"minecraft:bubble_coral_block", 626}, + {"minecraft:bubble_coral_fan", 641}, + {"minecraft:bucket", 950}, + {"minecraft:budding_amethyst", 89}, + {"minecraft:bundle", 974}, + {"minecraft:burn_pottery_sherd", 1357}, + {"minecraft:bush", 204}, + {"minecraft:cactus", 328}, + {"minecraft:cactus_flower", 329}, + {"minecraft:cake", 1023}, + {"minecraft:calcite", 11}, + {"minecraft:calibrated_sculk_sensor", 706}, + {"minecraft:camel_spawn_egg", 1077}, + {"minecraft:campfire", 1282}, + {"minecraft:candle", 1305}, + {"minecraft:carrot", 1159}, + {"minecraft:carrot_on_a_stick", 806}, + {"minecraft:cartography_table", 1272}, + {"minecraft:carved_pumpkin", 345}, + {"minecraft:cat_spawn_egg", 1076}, + {"minecraft:cauldron", 1065}, + {"minecraft:cave_spider_spawn_egg", 1078}, + {"minecraft:chain", 378}, + {"minecraft:chain_command_block", 545}, + {"minecraft:chainmail_boots", 903}, + {"minecraft:chainmail_chestplate", 901}, + {"minecraft:chainmail_helmet", 900}, + {"minecraft:chainmail_leggings", 902}, + {"minecraft:charcoal", 844}, + {"minecraft:cherry_boat", 820}, + {"minecraft:cherry_button", 719}, + {"minecraft:cherry_chest_boat", 821}, + {"minecraft:cherry_door", 748}, + {"minecraft:cherry_fence", 337}, + {"minecraft:cherry_fence_gate", 789}, + {"minecraft:cherry_hanging_sign", 943}, + {"minecraft:cherry_leaves", 187}, + {"minecraft:cherry_log", 139}, + {"minecraft:cherry_planks", 41}, + {"minecraft:cherry_pressure_plate", 735}, + {"minecraft:cherry_sapling", 54}, + {"minecraft:cherry_sign", 931}, + {"minecraft:cherry_slab", 275}, + {"minecraft:cherry_stairs", 417}, + {"minecraft:cherry_trapdoor", 769}, + {"minecraft:cherry_wood", 176}, + {"minecraft:chest", 319}, + {"minecraft:chest_minecart", 802}, + {"minecraft:chicken", 1050}, + {"minecraft:chicken_spawn_egg", 1079}, + {"minecraft:chipped_anvil", 450}, + {"minecraft:chiseled_bookshelf", 306}, + {"minecraft:chiseled_copper", 98}, + {"minecraft:chiseled_deepslate", 372}, + {"minecraft:chiseled_nether_bricks", 397}, + {"minecraft:chiseled_polished_blackstone", 1299}, + {"minecraft:chiseled_quartz_block", 452}, + {"minecraft:chiseled_red_sandstone", 541}, + {"minecraft:chiseled_resin_bricks", 389}, + {"minecraft:chiseled_sandstone", 199}, + {"minecraft:chiseled_stone_bricks", 365}, + {"minecraft:chiseled_tuff", 16}, + {"minecraft:chiseled_tuff_bricks", 25}, + {"minecraft:chorus_flower", 313}, + {"minecraft:chorus_fruit", 1213}, + {"minecraft:chorus_plant", 312}, + {"minecraft:clay", 330}, + {"minecraft:clay_ball", 964}, + {"minecraft:clock", 992}, + {"minecraft:closed_eyeblossom", 231}, + {"minecraft:coal", 843}, + {"minecraft:coal_block", 83}, + {"minecraft:coal_ore", 64}, + {"minecraft:coarse_dirt", 29}, + {"minecraft:coast_armor_trim_smithing_template", 1336}, + {"minecraft:cobbled_deepslate", 9}, + {"minecraft:cobbled_deepslate_slab", 682}, + {"minecraft:cobbled_deepslate_stairs", 665}, + {"minecraft:cobbled_deepslate_wall", 445}, + {"minecraft:cobblestone", 35}, + {"minecraft:cobblestone_slab", 288}, + {"minecraft:cobblestone_stairs", 324}, + {"minecraft:cobblestone_wall", 427}, + {"minecraft:cobweb", 201}, + {"minecraft:cocoa_beans", 1003}, + {"minecraft:cod", 995}, + {"minecraft:cod_bucket", 959}, + {"minecraft:cod_spawn_egg", 1080}, + {"minecraft:command_block", 425}, + {"minecraft:command_block_minecart", 1193}, + {"minecraft:comparator", 691}, + {"minecraft:compass", 972}, + {"minecraft:composter", 1268}, + {"minecraft:conduit", 650}, + {"minecraft:cooked_beef", 1049}, + {"minecraft:cooked_chicken", 1051}, + {"minecraft:cooked_cod", 999}, + {"minecraft:cooked_mutton", 1195}, + {"minecraft:cooked_porkchop", 922}, + {"minecraft:cooked_rabbit", 1182}, + {"minecraft:cooked_salmon", 1000}, + {"minecraft:cookie", 1040}, + {"minecraft:copper_block", 91}, + {"minecraft:copper_bulb", 1383}, + {"minecraft:copper_door", 755}, + {"minecraft:copper_grate", 1375}, + {"minecraft:copper_ingot", 853}, + {"minecraft:copper_ore", 68}, + {"minecraft:copper_trapdoor", 776}, + {"minecraft:cornflower", 241}, + {"minecraft:cow_spawn_egg", 1081}, + {"minecraft:cracked_deepslate_bricks", 369}, + {"minecraft:cracked_deepslate_tiles", 371}, + {"minecraft:cracked_nether_bricks", 396}, + {"minecraft:cracked_polished_blackstone_bricks", 1303}, + {"minecraft:cracked_stone_bricks", 364}, + {"minecraft:crafter", 1041}, + {"minecraft:crafting_table", 320}, + {"minecraft:creaking_heart", 318}, + {"minecraft:creaking_spawn_egg", 1144}, + {"minecraft:creeper_banner_pattern", 1258}, + {"minecraft:creeper_head", 1169}, + {"minecraft:creeper_spawn_egg", 1082}, + {"minecraft:crimson_button", 724}, + {"minecraft:crimson_door", 753}, + {"minecraft:crimson_fence", 342}, + {"minecraft:crimson_fence_gate", 794}, + {"minecraft:crimson_fungus", 249}, + {"minecraft:crimson_hanging_sign", 948}, + {"minecraft:crimson_hyphae", 180}, + {"minecraft:crimson_nylium", 33}, + {"minecraft:crimson_planks", 46}, + {"minecraft:crimson_pressure_plate", 740}, + {"minecraft:crimson_roots", 251}, + {"minecraft:crimson_sign", 936}, + {"minecraft:crimson_slab", 281}, + {"minecraft:crimson_stairs", 423}, + {"minecraft:crimson_stem", 145}, + {"minecraft:crimson_trapdoor", 774}, + {"minecraft:crossbow", 1254}, + {"minecraft:crying_obsidian", 1291}, + {"minecraft:cut_copper", 102}, + {"minecraft:cut_copper_slab", 110}, + {"minecraft:cut_copper_stairs", 106}, + {"minecraft:cut_red_sandstone", 542}, + {"minecraft:cut_red_sandstone_slab", 295}, + {"minecraft:cut_sandstone", 200}, + {"minecraft:cut_sandstone_slab", 286}, + {"minecraft:cyan_banner", 1205}, + {"minecraft:cyan_bed", 1033}, + {"minecraft:cyan_bundle", 984}, + {"minecraft:cyan_candle", 1315}, + {"minecraft:cyan_carpet", 485}, + {"minecraft:cyan_concrete", 594}, + {"minecraft:cyan_concrete_powder", 610}, + {"minecraft:cyan_dye", 1013}, + {"minecraft:cyan_glazed_terracotta", 578}, + {"minecraft:cyan_shulker_box", 562}, + {"minecraft:cyan_stained_glass", 510}, + {"minecraft:cyan_stained_glass_pane", 526}, + {"minecraft:cyan_terracotta", 466}, + {"minecraft:cyan_wool", 222}, + {"minecraft:damaged_anvil", 451}, + {"minecraft:dandelion", 229}, + {"minecraft:danger_pottery_sherd", 1358}, + {"minecraft:dark_oak_boat", 822}, + {"minecraft:dark_oak_button", 720}, + {"minecraft:dark_oak_chest_boat", 823}, + {"minecraft:dark_oak_door", 749}, + {"minecraft:dark_oak_fence", 338}, + {"minecraft:dark_oak_fence_gate", 790}, + {"minecraft:dark_oak_hanging_sign", 944}, + {"minecraft:dark_oak_leaves", 188}, + {"minecraft:dark_oak_log", 141}, + {"minecraft:dark_oak_planks", 42}, + {"minecraft:dark_oak_pressure_plate", 736}, + {"minecraft:dark_oak_sapling", 55}, + {"minecraft:dark_oak_sign", 932}, + {"minecraft:dark_oak_slab", 276}, + {"minecraft:dark_oak_stairs", 418}, + {"minecraft:dark_oak_trapdoor", 770}, + {"minecraft:dark_oak_wood", 178}, + {"minecraft:dark_prismarine", 535}, + {"minecraft:dark_prismarine_slab", 299}, + {"minecraft:dark_prismarine_stairs", 538}, + {"minecraft:daylight_detector", 704}, + {"minecraft:dead_brain_coral", 634}, + {"minecraft:dead_brain_coral_block", 620}, + {"minecraft:dead_brain_coral_fan", 645}, + {"minecraft:dead_bubble_coral", 635}, + {"minecraft:dead_bubble_coral_block", 621}, + {"minecraft:dead_bubble_coral_fan", 646}, + {"minecraft:dead_bush", 207}, + {"minecraft:dead_fire_coral", 636}, + {"minecraft:dead_fire_coral_block", 622}, + {"minecraft:dead_fire_coral_fan", 647}, + {"minecraft:dead_horn_coral", 637}, + {"minecraft:dead_horn_coral_block", 623}, + {"minecraft:dead_horn_coral_fan", 648}, + {"minecraft:dead_tube_coral", 638}, + {"minecraft:dead_tube_coral_block", 619}, + {"minecraft:dead_tube_coral_fan", 644}, + {"minecraft:debug_stick", 1230}, + {"minecraft:decorated_pot", 307}, + {"minecraft:deepslate", 8}, + {"minecraft:deepslate_brick_slab", 684}, + {"minecraft:deepslate_brick_stairs", 667}, + {"minecraft:deepslate_brick_wall", 447}, + {"minecraft:deepslate_bricks", 368}, + {"minecraft:deepslate_coal_ore", 65}, + {"minecraft:deepslate_copper_ore", 69}, + {"minecraft:deepslate_diamond_ore", 79}, + {"minecraft:deepslate_emerald_ore", 75}, + {"minecraft:deepslate_gold_ore", 71}, + {"minecraft:deepslate_iron_ore", 67}, + {"minecraft:deepslate_lapis_ore", 77}, + {"minecraft:deepslate_redstone_ore", 73}, + {"minecraft:deepslate_tile_slab", 685}, + {"minecraft:deepslate_tile_stairs", 668}, + {"minecraft:deepslate_tile_wall", 448}, + {"minecraft:deepslate_tiles", 370}, + {"minecraft:detector_rail", 797}, + {"minecraft:diamond", 845}, + {"minecraft:diamond_axe", 881}, + {"minecraft:diamond_block", 93}, + {"minecraft:diamond_boots", 911}, + {"minecraft:diamond_chestplate", 909}, + {"minecraft:diamond_helmet", 908}, + {"minecraft:diamond_hoe", 882}, + {"minecraft:diamond_horse_armor", 1189}, + {"minecraft:diamond_leggings", 910}, + {"minecraft:diamond_ore", 78}, + {"minecraft:diamond_pickaxe", 880}, + {"minecraft:diamond_shovel", 879}, + {"minecraft:diamond_sword", 878}, + {"minecraft:diorite", 4}, + {"minecraft:diorite_slab", 681}, + {"minecraft:diorite_stairs", 664}, + {"minecraft:diorite_wall", 441}, + {"minecraft:dirt", 28}, + {"minecraft:dirt_path", 494}, + {"minecraft:disc_fragment_5", 1250}, + {"minecraft:dispenser", 698}, + {"minecraft:dolphin_spawn_egg", 1083}, + {"minecraft:donkey_spawn_egg", 1084}, + {"minecraft:dragon_breath", 1220}, + {"minecraft:dragon_egg", 408}, + {"minecraft:dragon_head", 1170}, + {"minecraft:dried_kelp", 1045}, + {"minecraft:dried_kelp_block", 965}, + {"minecraft:dripstone_block", 26}, + {"minecraft:dropper", 699}, + {"minecraft:drowned_spawn_egg", 1085}, + {"minecraft:dune_armor_trim_smithing_template", 1335}, + {"minecraft:echo_shard", 1331}, + {"minecraft:egg", 969}, + {"minecraft:elder_guardian_spawn_egg", 1086}, + {"minecraft:elytra", 809}, + {"minecraft:emerald", 846}, + {"minecraft:emerald_block", 411}, + {"minecraft:emerald_ore", 74}, + {"minecraft:enchanted_book", 1176}, + {"minecraft:enchanted_golden_apple", 925}, + {"minecraft:enchanting_table", 404}, + {"minecraft:end_crystal", 1212}, + {"minecraft:end_portal_frame", 405}, + {"minecraft:end_rod", 311}, + {"minecraft:end_stone", 406}, + {"minecraft:end_stone_brick_slab", 674}, + {"minecraft:end_stone_brick_stairs", 656}, + {"minecraft:end_stone_brick_wall", 440}, + {"minecraft:end_stone_bricks", 407}, + {"minecraft:ender_chest", 410}, + {"minecraft:ender_dragon_spawn_egg", 1087}, + {"minecraft:ender_eye", 1066}, + {"minecraft:ender_pearl", 1053}, + {"minecraft:enderman_spawn_egg", 1088}, + {"minecraft:endermite_spawn_egg", 1089}, + {"minecraft:evoker_spawn_egg", 1090}, + {"minecraft:experience_bottle", 1149}, + {"minecraft:explorer_pottery_sherd", 1359}, + {"minecraft:exposed_chiseled_copper", 99}, + {"minecraft:exposed_copper", 95}, + {"minecraft:exposed_copper_bulb", 1384}, + {"minecraft:exposed_copper_door", 756}, + {"minecraft:exposed_copper_grate", 1376}, + {"minecraft:exposed_copper_trapdoor", 777}, + {"minecraft:exposed_cut_copper", 103}, + {"minecraft:exposed_cut_copper_slab", 111}, + {"minecraft:exposed_cut_copper_stairs", 107}, + {"minecraft:eye_armor_trim_smithing_template", 1339}, + {"minecraft:farmland", 321}, + {"minecraft:feather", 891}, + {"minecraft:fermented_spider_eye", 1061}, + {"minecraft:fern", 203}, + {"minecraft:field_masoned_banner_pattern", 1265}, + {"minecraft:filled_map", 1042}, + {"minecraft:fire_charge", 1150}, + {"minecraft:fire_coral", 632}, + {"minecraft:fire_coral_block", 627}, + {"minecraft:fire_coral_fan", 642}, + {"minecraft:firefly_bush", 208}, + {"minecraft:firework_rocket", 1174}, + {"minecraft:firework_star", 1175}, + {"minecraft:fishing_rod", 991}, + {"minecraft:fletching_table", 1273}, + {"minecraft:flint", 920}, + {"minecraft:flint_and_steel", 838}, + {"minecraft:flow_armor_trim_smithing_template", 1350}, + {"minecraft:flow_banner_pattern", 1263}, + {"minecraft:flow_pottery_sherd", 1360}, + {"minecraft:flower_banner_pattern", 1257}, + {"minecraft:flower_pot", 1158}, + {"minecraft:flowering_azalea", 206}, + {"minecraft:flowering_azalea_leaves", 192}, + {"minecraft:fox_spawn_egg", 1091}, + {"minecraft:friend_pottery_sherd", 1361}, + {"minecraft:frog_spawn_egg", 1092}, + {"minecraft:frogspawn", 1330}, + {"minecraft:furnace", 322}, + {"minecraft:furnace_minecart", 803}, + {"minecraft:ghast_spawn_egg", 1093}, + {"minecraft:ghast_tear", 1055}, + {"minecraft:gilded_blackstone", 1295}, + {"minecraft:glass", 195}, + {"minecraft:glass_bottle", 1058}, + {"minecraft:glass_pane", 379}, + {"minecraft:glistering_melon_slice", 1067}, + {"minecraft:globe_banner_pattern", 1261}, + {"minecraft:glow_berries", 1281}, + {"minecraft:glow_ink_sac", 1002}, + {"minecraft:glow_item_frame", 1157}, + {"minecraft:glow_lichen", 382}, + {"minecraft:glow_squid_spawn_egg", 1094}, + {"minecraft:glowstone", 354}, + {"minecraft:glowstone_dust", 994}, + {"minecraft:goat_horn", 1267}, + {"minecraft:goat_spawn_egg", 1095}, + {"minecraft:gold_block", 92}, + {"minecraft:gold_ingot", 855}, + {"minecraft:gold_nugget", 1056}, + {"minecraft:gold_ore", 70}, + {"minecraft:golden_apple", 924}, + {"minecraft:golden_axe", 871}, + {"minecraft:golden_boots", 915}, + {"minecraft:golden_carrot", 1164}, + {"minecraft:golden_chestplate", 913}, + {"minecraft:golden_helmet", 912}, + {"minecraft:golden_hoe", 872}, + {"minecraft:golden_horse_armor", 1188}, + {"minecraft:golden_leggings", 914}, + {"minecraft:golden_pickaxe", 870}, + {"minecraft:golden_shovel", 869}, + {"minecraft:golden_sword", 868}, + {"minecraft:granite", 2}, + {"minecraft:granite_slab", 677}, + {"minecraft:granite_stairs", 660}, + {"minecraft:granite_wall", 433}, + {"minecraft:grass_block", 27}, + {"minecraft:gravel", 63}, + {"minecraft:gray_banner", 1203}, + {"minecraft:gray_bed", 1031}, + {"minecraft:gray_bundle", 982}, + {"minecraft:gray_candle", 1313}, + {"minecraft:gray_carpet", 483}, + {"minecraft:gray_concrete", 592}, + {"minecraft:gray_concrete_powder", 608}, + {"minecraft:gray_dye", 1011}, + {"minecraft:gray_glazed_terracotta", 576}, + {"minecraft:gray_shulker_box", 560}, + {"minecraft:gray_stained_glass", 508}, + {"minecraft:gray_stained_glass_pane", 524}, + {"minecraft:gray_terracotta", 464}, + {"minecraft:gray_wool", 220}, + {"minecraft:green_banner", 1209}, + {"minecraft:green_bed", 1037}, + {"minecraft:green_bundle", 988}, + {"minecraft:green_candle", 1319}, + {"minecraft:green_carpet", 489}, + {"minecraft:green_concrete", 598}, + {"minecraft:green_concrete_powder", 614}, + {"minecraft:green_dye", 1017}, + {"minecraft:green_glazed_terracotta", 582}, + {"minecraft:green_shulker_box", 566}, + {"minecraft:green_stained_glass", 514}, + {"minecraft:green_stained_glass_pane", 530}, + {"minecraft:green_terracotta", 470}, + {"minecraft:green_wool", 226}, + {"minecraft:grindstone", 1274}, + {"minecraft:guardian_spawn_egg", 1096}, + {"minecraft:gunpowder", 892}, + {"minecraft:guster_banner_pattern", 1264}, + {"minecraft:guster_pottery_sherd", 1362}, + {"minecraft:hanging_roots", 266}, + {"minecraft:hay_block", 475}, + {"minecraft:heart_of_the_sea", 1253}, + {"minecraft:heart_pottery_sherd", 1363}, + {"minecraft:heartbreak_pottery_sherd", 1364}, + {"minecraft:heavy_core", 87}, + {"minecraft:heavy_weighted_pressure_plate", 729}, + {"minecraft:hoglin_spawn_egg", 1097}, + {"minecraft:honey_block", 695}, + {"minecraft:honey_bottle", 1288}, + {"minecraft:honeycomb", 1285}, + {"minecraft:honeycomb_block", 1289}, + {"minecraft:hopper", 697}, + {"minecraft:hopper_minecart", 805}, + {"minecraft:horn_coral", 633}, + {"minecraft:horn_coral_block", 628}, + {"minecraft:horn_coral_fan", 643}, + {"minecraft:horse_spawn_egg", 1098}, + {"minecraft:host_armor_trim_smithing_template", 1349}, + {"minecraft:howl_pottery_sherd", 1365}, + {"minecraft:husk_spawn_egg", 1099}, + {"minecraft:ice", 326}, + {"minecraft:infested_chiseled_stone_bricks", 360}, + {"minecraft:infested_cobblestone", 356}, + {"minecraft:infested_cracked_stone_bricks", 359}, + {"minecraft:infested_deepslate", 361}, + {"minecraft:infested_mossy_stone_bricks", 358}, + {"minecraft:infested_stone", 355}, + {"minecraft:infested_stone_bricks", 357}, + {"minecraft:ink_sac", 1001}, + {"minecraft:iron_axe", 876}, + {"minecraft:iron_bars", 377}, + {"minecraft:iron_block", 90}, + {"minecraft:iron_boots", 907}, + {"minecraft:iron_chestplate", 905}, + {"minecraft:iron_door", 742}, + {"minecraft:iron_golem_spawn_egg", 1100}, + {"minecraft:iron_helmet", 904}, + {"minecraft:iron_hoe", 877}, + {"minecraft:iron_horse_armor", 1187}, + {"minecraft:iron_ingot", 851}, + {"minecraft:iron_leggings", 906}, + {"minecraft:iron_nugget", 1228}, + {"minecraft:iron_ore", 66}, + {"minecraft:iron_pickaxe", 875}, + {"minecraft:iron_shovel", 874}, + {"minecraft:iron_sword", 873}, + {"minecraft:iron_trapdoor", 763}, + {"minecraft:item_frame", 1156}, + {"minecraft:jack_o_lantern", 346}, + {"minecraft:jigsaw", 831}, + {"minecraft:jukebox", 331}, + {"minecraft:jungle_boat", 816}, + {"minecraft:jungle_button", 717}, + {"minecraft:jungle_chest_boat", 817}, + {"minecraft:jungle_door", 746}, + {"minecraft:jungle_fence", 335}, + {"minecraft:jungle_fence_gate", 787}, + {"minecraft:jungle_hanging_sign", 941}, + {"minecraft:jungle_leaves", 185}, + {"minecraft:jungle_log", 137}, + {"minecraft:jungle_planks", 39}, + {"minecraft:jungle_pressure_plate", 733}, + {"minecraft:jungle_sapling", 52}, + {"minecraft:jungle_sign", 929}, + {"minecraft:jungle_slab", 273}, + {"minecraft:jungle_stairs", 415}, + {"minecraft:jungle_trapdoor", 767}, + {"minecraft:jungle_wood", 174}, + {"minecraft:kelp", 257}, + {"minecraft:knowledge_book", 1229}, + {"minecraft:ladder", 323}, + {"minecraft:lantern", 1278}, + {"minecraft:lapis_block", 197}, + {"minecraft:lapis_lazuli", 847}, + {"minecraft:lapis_ore", 76}, + {"minecraft:large_amethyst_bud", 1324}, + {"minecraft:large_fern", 500}, + {"minecraft:lava_bucket", 952}, + {"minecraft:lead", 1191}, + {"minecraft:leaf_litter", 260}, + {"minecraft:leather", 955}, + {"minecraft:leather_boots", 899}, + {"minecraft:leather_chestplate", 897}, + {"minecraft:leather_helmet", 896}, + {"minecraft:leather_horse_armor", 1190}, + {"minecraft:leather_leggings", 898}, + {"minecraft:lectern", 700}, + {"minecraft:lever", 702}, + {"minecraft:light", 474}, + {"minecraft:light_blue_banner", 1199}, + {"minecraft:light_blue_bed", 1027}, + {"minecraft:light_blue_bundle", 978}, + {"minecraft:light_blue_candle", 1309}, + {"minecraft:light_blue_carpet", 479}, + {"minecraft:light_blue_concrete", 588}, + {"minecraft:light_blue_concrete_powder", 604}, + {"minecraft:light_blue_dye", 1007}, + {"minecraft:light_blue_glazed_terracotta", 572}, + {"minecraft:light_blue_shulker_box", 556}, + {"minecraft:light_blue_stained_glass", 504}, + {"minecraft:light_blue_stained_glass_pane", 520}, + {"minecraft:light_blue_terracotta", 460}, + {"minecraft:light_blue_wool", 216}, + {"minecraft:light_gray_banner", 1204}, + {"minecraft:light_gray_bed", 1032}, + {"minecraft:light_gray_bundle", 983}, + {"minecraft:light_gray_candle", 1314}, + {"minecraft:light_gray_carpet", 484}, + {"minecraft:light_gray_concrete", 593}, + {"minecraft:light_gray_concrete_powder", 609}, + {"minecraft:light_gray_dye", 1012}, + {"minecraft:light_gray_glazed_terracotta", 577}, + {"minecraft:light_gray_shulker_box", 561}, + {"minecraft:light_gray_stained_glass", 509}, + {"minecraft:light_gray_stained_glass_pane", 525}, + {"minecraft:light_gray_terracotta", 465}, + {"minecraft:light_gray_wool", 221}, + {"minecraft:light_weighted_pressure_plate", 728}, + {"minecraft:lightning_rod", 703}, + {"minecraft:lilac", 496}, + {"minecraft:lily_of_the_valley", 242}, + {"minecraft:lily_pad", 394}, + {"minecraft:lime_banner", 1201}, + {"minecraft:lime_bed", 1029}, + {"minecraft:lime_bundle", 980}, + {"minecraft:lime_candle", 1311}, + {"minecraft:lime_carpet", 481}, + {"minecraft:lime_concrete", 590}, + {"minecraft:lime_concrete_powder", 606}, + {"minecraft:lime_dye", 1009}, + {"minecraft:lime_glazed_terracotta", 574}, + {"minecraft:lime_shulker_box", 558}, + {"minecraft:lime_stained_glass", 506}, + {"minecraft:lime_stained_glass_pane", 522}, + {"minecraft:lime_terracotta", 462}, + {"minecraft:lime_wool", 218}, + {"minecraft:lingering_potion", 1224}, + {"minecraft:llama_spawn_egg", 1101}, + {"minecraft:lodestone", 1290}, + {"minecraft:loom", 1256}, + {"minecraft:mace", 1155}, + {"minecraft:magenta_banner", 1198}, + {"minecraft:magenta_bed", 1026}, + {"minecraft:magenta_bundle", 977}, + {"minecraft:magenta_candle", 1308}, + {"minecraft:magenta_carpet", 478}, + {"minecraft:magenta_concrete", 587}, + {"minecraft:magenta_concrete_powder", 603}, + {"minecraft:magenta_dye", 1006}, + {"minecraft:magenta_glazed_terracotta", 571}, + {"minecraft:magenta_shulker_box", 555}, + {"minecraft:magenta_stained_glass", 503}, + {"minecraft:magenta_stained_glass_pane", 519}, + {"minecraft:magenta_terracotta", 459}, + {"minecraft:magenta_wool", 215}, + {"minecraft:magma_block", 546}, + {"minecraft:magma_cream", 1063}, + {"minecraft:magma_cube_spawn_egg", 1102}, + {"minecraft:mangrove_boat", 826}, + {"minecraft:mangrove_button", 722}, + {"minecraft:mangrove_chest_boat", 827}, + {"minecraft:mangrove_door", 751}, + {"minecraft:mangrove_fence", 340}, + {"minecraft:mangrove_fence_gate", 792}, + {"minecraft:mangrove_hanging_sign", 946}, + {"minecraft:mangrove_leaves", 190}, + {"minecraft:mangrove_log", 142}, + {"minecraft:mangrove_planks", 44}, + {"minecraft:mangrove_pressure_plate", 738}, + {"minecraft:mangrove_propagule", 57}, + {"minecraft:mangrove_roots", 143}, + {"minecraft:mangrove_sign", 934}, + {"minecraft:mangrove_slab", 278}, + {"minecraft:mangrove_stairs", 420}, + {"minecraft:mangrove_trapdoor", 772}, + {"minecraft:mangrove_wood", 179}, + {"minecraft:map", 1163}, + {"minecraft:medium_amethyst_bud", 1323}, + {"minecraft:melon", 380}, + {"minecraft:melon_seeds", 1047}, + {"minecraft:melon_slice", 1044}, + {"minecraft:milk_bucket", 956}, + {"minecraft:minecart", 801}, + {"minecraft:miner_pottery_sherd", 1366}, + {"minecraft:mojang_banner_pattern", 1260}, + {"minecraft:mooshroom_spawn_egg", 1103}, + {"minecraft:moss_block", 262}, + {"minecraft:moss_carpet", 261}, + {"minecraft:mossy_cobblestone", 308}, + {"minecraft:mossy_cobblestone_slab", 673}, + {"minecraft:mossy_cobblestone_stairs", 655}, + {"minecraft:mossy_cobblestone_wall", 428}, + {"minecraft:mossy_stone_brick_slab", 671}, + {"minecraft:mossy_stone_brick_stairs", 653}, + {"minecraft:mossy_stone_brick_wall", 432}, + {"minecraft:mossy_stone_bricks", 363}, + {"minecraft:mourner_pottery_sherd", 1367}, + {"minecraft:mud", 32}, + {"minecraft:mud_brick_slab", 291}, + {"minecraft:mud_brick_stairs", 392}, + {"minecraft:mud_brick_wall", 435}, + {"minecraft:mud_bricks", 367}, + {"minecraft:muddy_mangrove_roots", 144}, + {"minecraft:mule_spawn_egg", 1104}, + {"minecraft:mushroom_stem", 376}, + {"minecraft:mushroom_stew", 889}, + {"minecraft:music_disc_11", 1243}, + {"minecraft:music_disc_13", 1231}, + {"minecraft:music_disc_5", 1247}, + {"minecraft:music_disc_blocks", 1233}, + {"minecraft:music_disc_cat", 1232}, + {"minecraft:music_disc_chirp", 1234}, + {"minecraft:music_disc_creator", 1235}, + {"minecraft:music_disc_creator_music_box", 1236}, + {"minecraft:music_disc_far", 1237}, + {"minecraft:music_disc_mall", 1238}, + {"minecraft:music_disc_mellohi", 1239}, + {"minecraft:music_disc_otherside", 1245}, + {"minecraft:music_disc_pigstep", 1248}, + {"minecraft:music_disc_precipice", 1249}, + {"minecraft:music_disc_relic", 1246}, + {"minecraft:music_disc_stal", 1240}, + {"minecraft:music_disc_strad", 1241}, + {"minecraft:music_disc_wait", 1244}, + {"minecraft:music_disc_ward", 1242}, + {"minecraft:mutton", 1194}, + {"minecraft:mycelium", 393}, + {"minecraft:name_tag", 1192}, + {"minecraft:nautilus_shell", 1252}, + {"minecraft:nether_brick", 1177}, + {"minecraft:nether_brick_fence", 398}, + {"minecraft:nether_brick_slab", 292}, + {"minecraft:nether_brick_stairs", 399}, + {"minecraft:nether_brick_wall", 436}, + {"minecraft:nether_bricks", 395}, + {"minecraft:nether_gold_ore", 80}, + {"minecraft:nether_quartz_ore", 81}, + {"minecraft:nether_sprouts", 253}, + {"minecraft:nether_star", 1172}, + {"minecraft:nether_wart", 1057}, + {"minecraft:nether_wart_block", 547}, + {"minecraft:netherite_axe", 886}, + {"minecraft:netherite_block", 94}, + {"minecraft:netherite_boots", 919}, + {"minecraft:netherite_chestplate", 917}, + {"minecraft:netherite_helmet", 916}, + {"minecraft:netherite_hoe", 887}, + {"minecraft:netherite_ingot", 856}, + {"minecraft:netherite_leggings", 918}, + {"minecraft:netherite_pickaxe", 885}, + {"minecraft:netherite_scrap", 857}, + {"minecraft:netherite_shovel", 884}, + {"minecraft:netherite_sword", 883}, + {"minecraft:netherite_upgrade_smithing_template", 1333}, + {"minecraft:netherrack", 347}, + {"minecraft:note_block", 711}, + {"minecraft:oak_boat", 810}, + {"minecraft:oak_button", 714}, + {"minecraft:oak_chest_boat", 811}, + {"minecraft:oak_door", 743}, + {"minecraft:oak_fence", 332}, + {"minecraft:oak_fence_gate", 784}, + {"minecraft:oak_hanging_sign", 938}, + {"minecraft:oak_leaves", 182}, + {"minecraft:oak_log", 134}, + {"minecraft:oak_planks", 36}, + {"minecraft:oak_pressure_plate", 730}, + {"minecraft:oak_sapling", 49}, + {"minecraft:oak_sign", 926}, + {"minecraft:oak_slab", 270}, + {"minecraft:oak_stairs", 412}, + {"minecraft:oak_trapdoor", 764}, + {"minecraft:oak_wood", 171}, + {"minecraft:observer", 696}, + {"minecraft:obsidian", 309}, + {"minecraft:ocelot_spawn_egg", 1105}, + {"minecraft:ochre_froglight", 1327}, + {"minecraft:ominous_bottle", 1395}, + {"minecraft:ominous_trial_key", 1393}, + {"minecraft:open_eyeblossom", 230}, + {"minecraft:orange_banner", 1197}, + {"minecraft:orange_bed", 1025}, + {"minecraft:orange_bundle", 976}, + {"minecraft:orange_candle", 1307}, + {"minecraft:orange_carpet", 477}, + {"minecraft:orange_concrete", 586}, + {"minecraft:orange_concrete_powder", 602}, + {"minecraft:orange_dye", 1005}, + {"minecraft:orange_glazed_terracotta", 570}, + {"minecraft:orange_shulker_box", 554}, + {"minecraft:orange_stained_glass", 502}, + {"minecraft:orange_stained_glass_pane", 518}, + {"minecraft:orange_terracotta", 458}, + {"minecraft:orange_tulip", 237}, + {"minecraft:orange_wool", 214}, + {"minecraft:oxeye_daisy", 240}, + {"minecraft:oxidized_chiseled_copper", 101}, + {"minecraft:oxidized_copper", 97}, + {"minecraft:oxidized_copper_bulb", 1386}, + {"minecraft:oxidized_copper_door", 758}, + {"minecraft:oxidized_copper_grate", 1378}, + {"minecraft:oxidized_copper_trapdoor", 779}, + {"minecraft:oxidized_cut_copper", 105}, + {"minecraft:oxidized_cut_copper_slab", 113}, + {"minecraft:oxidized_cut_copper_stairs", 109}, + {"minecraft:packed_ice", 493}, + {"minecraft:packed_mud", 366}, + {"minecraft:painting", 923}, + {"minecraft:pale_hanging_moss", 264}, + {"minecraft:pale_moss_block", 265}, + {"minecraft:pale_moss_carpet", 263}, + {"minecraft:pale_oak_boat", 824}, + {"minecraft:pale_oak_button", 721}, + {"minecraft:pale_oak_chest_boat", 825}, + {"minecraft:pale_oak_door", 750}, + {"minecraft:pale_oak_fence", 339}, + {"minecraft:pale_oak_fence_gate", 791}, + {"minecraft:pale_oak_hanging_sign", 945}, + {"minecraft:pale_oak_leaves", 189}, + {"minecraft:pale_oak_log", 140}, + {"minecraft:pale_oak_planks", 43}, + {"minecraft:pale_oak_pressure_plate", 737}, + {"minecraft:pale_oak_sapling", 56}, + {"minecraft:pale_oak_sign", 933}, + {"minecraft:pale_oak_slab", 277}, + {"minecraft:pale_oak_stairs", 419}, + {"minecraft:pale_oak_trapdoor", 771}, + {"minecraft:pale_oak_wood", 177}, + {"minecraft:panda_spawn_egg", 1106}, + {"minecraft:paper", 966}, + {"minecraft:parrot_spawn_egg", 1107}, + {"minecraft:pearlescent_froglight", 1329}, + {"minecraft:peony", 498}, + {"minecraft:petrified_oak_slab", 287}, + {"minecraft:phantom_membrane", 808}, + {"minecraft:phantom_spawn_egg", 1108}, + {"minecraft:pig_spawn_egg", 1109}, + {"minecraft:piglin_banner_pattern", 1262}, + {"minecraft:piglin_brute_spawn_egg", 1111}, + {"minecraft:piglin_head", 1171}, + {"minecraft:piglin_spawn_egg", 1110}, + {"minecraft:pillager_spawn_egg", 1112}, + {"minecraft:pink_banner", 1202}, + {"minecraft:pink_bed", 1030}, + {"minecraft:pink_bundle", 981}, + {"minecraft:pink_candle", 1312}, + {"minecraft:pink_carpet", 482}, + {"minecraft:pink_concrete", 591}, + {"minecraft:pink_concrete_powder", 607}, + {"minecraft:pink_dye", 1010}, + {"minecraft:pink_glazed_terracotta", 575}, + {"minecraft:pink_petals", 258}, + {"minecraft:pink_shulker_box", 559}, + {"minecraft:pink_stained_glass", 507}, + {"minecraft:pink_stained_glass_pane", 523}, + {"minecraft:pink_terracotta", 463}, + {"minecraft:pink_tulip", 239}, + {"minecraft:pink_wool", 219}, + {"minecraft:piston", 692}, + {"minecraft:pitcher_plant", 245}, + {"minecraft:pitcher_pod", 1216}, + {"minecraft:player_head", 1167}, + {"minecraft:plenty_pottery_sherd", 1368}, + {"minecraft:podzol", 30}, + {"minecraft:pointed_dripstone", 1326}, + {"minecraft:poisonous_potato", 1162}, + {"minecraft:polar_bear_spawn_egg", 1113}, + {"minecraft:polished_andesite", 7}, + {"minecraft:polished_andesite_slab", 680}, + {"minecraft:polished_andesite_stairs", 663}, + {"minecraft:polished_basalt", 351}, + {"minecraft:polished_blackstone", 1296}, + {"minecraft:polished_blackstone_brick_slab", 1301}, + {"minecraft:polished_blackstone_brick_stairs", 1302}, + {"minecraft:polished_blackstone_brick_wall", 444}, + {"minecraft:polished_blackstone_bricks", 1300}, + {"minecraft:polished_blackstone_button", 713}, + {"minecraft:polished_blackstone_pressure_plate", 727}, + {"minecraft:polished_blackstone_slab", 1297}, + {"minecraft:polished_blackstone_stairs", 1298}, + {"minecraft:polished_blackstone_wall", 443}, + {"minecraft:polished_deepslate", 10}, + {"minecraft:polished_deepslate_slab", 683}, + {"minecraft:polished_deepslate_stairs", 666}, + {"minecraft:polished_deepslate_wall", 446}, + {"minecraft:polished_diorite", 5}, + {"minecraft:polished_diorite_slab", 672}, + {"minecraft:polished_diorite_stairs", 654}, + {"minecraft:polished_granite", 3}, + {"minecraft:polished_granite_slab", 669}, + {"minecraft:polished_granite_stairs", 651}, + {"minecraft:polished_tuff", 17}, + {"minecraft:polished_tuff_slab", 18}, + {"minecraft:polished_tuff_stairs", 19}, + {"minecraft:polished_tuff_wall", 20}, + {"minecraft:popped_chorus_fruit", 1214}, + {"minecraft:poppy", 232}, + {"minecraft:porkchop", 921}, + {"minecraft:potato", 1160}, + {"minecraft:potion", 1059}, + {"minecraft:powder_snow_bucket", 953}, + {"minecraft:powered_rail", 796}, + {"minecraft:prismarine", 533}, + {"minecraft:prismarine_brick_slab", 298}, + {"minecraft:prismarine_brick_stairs", 537}, + {"minecraft:prismarine_bricks", 534}, + {"minecraft:prismarine_crystals", 1180}, + {"minecraft:prismarine_shard", 1179}, + {"minecraft:prismarine_slab", 297}, + {"minecraft:prismarine_stairs", 536}, + {"minecraft:prismarine_wall", 430}, + {"minecraft:prize_pottery_sherd", 1369}, + {"minecraft:pufferfish", 998}, + {"minecraft:pufferfish_bucket", 957}, + {"minecraft:pufferfish_spawn_egg", 1114}, + {"minecraft:pumpkin", 344}, + {"minecraft:pumpkin_pie", 1173}, + {"minecraft:pumpkin_seeds", 1046}, + {"minecraft:purple_banner", 1206}, + {"minecraft:purple_bed", 1034}, + {"minecraft:purple_bundle", 985}, + {"minecraft:purple_candle", 1316}, + {"minecraft:purple_carpet", 486}, + {"minecraft:purple_concrete", 595}, + {"minecraft:purple_concrete_powder", 611}, + {"minecraft:purple_dye", 1014}, + {"minecraft:purple_glazed_terracotta", 579}, + {"minecraft:purple_shulker_box", 563}, + {"minecraft:purple_stained_glass", 511}, + {"minecraft:purple_stained_glass_pane", 527}, + {"minecraft:purple_terracotta", 467}, + {"minecraft:purple_wool", 223}, + {"minecraft:purpur_block", 314}, + {"minecraft:purpur_pillar", 315}, + {"minecraft:purpur_slab", 296}, + {"minecraft:purpur_stairs", 316}, + {"minecraft:quartz", 848}, + {"minecraft:quartz_block", 453}, + {"minecraft:quartz_bricks", 454}, + {"minecraft:quartz_pillar", 455}, + {"minecraft:quartz_slab", 293}, + {"minecraft:quartz_stairs", 456}, + {"minecraft:rabbit", 1181}, + {"minecraft:rabbit_foot", 1184}, + {"minecraft:rabbit_hide", 1185}, + {"minecraft:rabbit_spawn_egg", 1115}, + {"minecraft:rabbit_stew", 1183}, + {"minecraft:rail", 798}, + {"minecraft:raiser_armor_trim_smithing_template", 1348}, + {"minecraft:ravager_spawn_egg", 1116}, + {"minecraft:raw_copper", 852}, + {"minecraft:raw_copper_block", 85}, + {"minecraft:raw_gold", 854}, + {"minecraft:raw_gold_block", 86}, + {"minecraft:raw_iron", 850}, + {"minecraft:raw_iron_block", 84}, + {"minecraft:recovery_compass", 973}, + {"minecraft:red_banner", 1210}, + {"minecraft:red_bed", 1038}, + {"minecraft:red_bundle", 989}, + {"minecraft:red_candle", 1320}, + {"minecraft:red_carpet", 490}, + {"minecraft:red_concrete", 599}, + {"minecraft:red_concrete_powder", 615}, + {"minecraft:red_dye", 1018}, + {"minecraft:red_glazed_terracotta", 583}, + {"minecraft:red_mushroom", 248}, + {"minecraft:red_mushroom_block", 375}, + {"minecraft:red_nether_brick_slab", 679}, + {"minecraft:red_nether_brick_stairs", 662}, + {"minecraft:red_nether_brick_wall", 438}, + {"minecraft:red_nether_bricks", 549}, + {"minecraft:red_sand", 62}, + {"minecraft:red_sandstone", 540}, + {"minecraft:red_sandstone_slab", 294}, + {"minecraft:red_sandstone_stairs", 543}, + {"minecraft:red_sandstone_wall", 431}, + {"minecraft:red_shulker_box", 567}, + {"minecraft:red_stained_glass", 515}, + {"minecraft:red_stained_glass_pane", 531}, + {"minecraft:red_terracotta", 471}, + {"minecraft:red_tulip", 236}, + {"minecraft:red_wool", 227}, + {"minecraft:redstone", 687}, + {"minecraft:redstone_block", 689}, + {"minecraft:redstone_lamp", 710}, + {"minecraft:redstone_ore", 72}, + {"minecraft:redstone_torch", 688}, + {"minecraft:reinforced_deepslate", 373}, + {"minecraft:repeater", 690}, + {"minecraft:repeating_command_block", 544}, + {"minecraft:resin_block", 384}, + {"minecraft:resin_brick", 1178}, + {"minecraft:resin_brick_slab", 387}, + {"minecraft:resin_brick_stairs", 386}, + {"minecraft:resin_brick_wall", 388}, + {"minecraft:resin_bricks", 385}, + {"minecraft:resin_clump", 383}, + {"minecraft:respawn_anchor", 1304}, + {"minecraft:rib_armor_trim_smithing_template", 1343}, + {"minecraft:rooted_dirt", 31}, + {"minecraft:rose_bush", 497}, + {"minecraft:rotten_flesh", 1052}, + {"minecraft:saddle", 800}, + {"minecraft:salmon", 996}, + {"minecraft:salmon_bucket", 958}, + {"minecraft:salmon_spawn_egg", 1117}, + {"minecraft:sand", 59}, + {"minecraft:sandstone", 198}, + {"minecraft:sandstone_slab", 285}, + {"minecraft:sandstone_stairs", 409}, + {"minecraft:sandstone_wall", 439}, + {"minecraft:scaffolding", 686}, + {"minecraft:scrape_pottery_sherd", 1370}, + {"minecraft:sculk", 400}, + {"minecraft:sculk_catalyst", 402}, + {"minecraft:sculk_sensor", 705}, + {"minecraft:sculk_shrieker", 403}, + {"minecraft:sculk_vein", 401}, + {"minecraft:sea_lantern", 539}, + {"minecraft:sea_pickle", 212}, + {"minecraft:seagrass", 211}, + {"minecraft:sentry_armor_trim_smithing_template", 1334}, + {"minecraft:shaper_armor_trim_smithing_template", 1346}, + {"minecraft:sheaf_pottery_sherd", 1371}, + {"minecraft:shears", 1043}, + {"minecraft:sheep_spawn_egg", 1118}, + {"minecraft:shelter_pottery_sherd", 1372}, + {"minecraft:shield", 1225}, + {"minecraft:short_dry_grass", 209}, + {"minecraft:short_grass", 202}, + {"minecraft:shroomlight", 1284}, + {"minecraft:shulker_box", 552}, + {"minecraft:shulker_shell", 1227}, + {"minecraft:shulker_spawn_egg", 1119}, + {"minecraft:silence_armor_trim_smithing_template", 1347}, + {"minecraft:silverfish_spawn_egg", 1120}, + {"minecraft:skeleton_horse_spawn_egg", 1122}, + {"minecraft:skeleton_skull", 1165}, + {"minecraft:skeleton_spawn_egg", 1121}, + {"minecraft:skull_banner_pattern", 1259}, + {"minecraft:skull_pottery_sherd", 1373}, + {"minecraft:slime_ball", 968}, + {"minecraft:slime_block", 694}, + {"minecraft:slime_spawn_egg", 1123}, + {"minecraft:small_amethyst_bud", 1322}, + {"minecraft:small_dripleaf", 268}, + {"minecraft:smithing_table", 1275}, + {"minecraft:smoker", 1270}, + {"minecraft:smooth_basalt", 352}, + {"minecraft:smooth_quartz", 300}, + {"minecraft:smooth_quartz_slab", 676}, + {"minecraft:smooth_quartz_stairs", 659}, + {"minecraft:smooth_red_sandstone", 301}, + {"minecraft:smooth_red_sandstone_slab", 670}, + {"minecraft:smooth_red_sandstone_stairs", 652}, + {"minecraft:smooth_sandstone", 302}, + {"minecraft:smooth_sandstone_slab", 675}, + {"minecraft:smooth_sandstone_stairs", 658}, + {"minecraft:smooth_stone", 303}, + {"minecraft:smooth_stone_slab", 284}, + {"minecraft:sniffer_egg", 618}, + {"minecraft:sniffer_spawn_egg", 1124}, + {"minecraft:snort_pottery_sherd", 1374}, + {"minecraft:snout_armor_trim_smithing_template", 1342}, + {"minecraft:snow", 325}, + {"minecraft:snow_block", 327}, + {"minecraft:snow_golem_spawn_egg", 1125}, + {"minecraft:snowball", 954}, + {"minecraft:soul_campfire", 1283}, + {"minecraft:soul_lantern", 1279}, + {"minecraft:soul_sand", 348}, + {"minecraft:soul_soil", 349}, + {"minecraft:soul_torch", 353}, + {"minecraft:spawner", 317}, + {"minecraft:spectral_arrow", 1222}, + {"minecraft:spider_eye", 1060}, + {"minecraft:spider_spawn_egg", 1126}, + {"minecraft:spire_armor_trim_smithing_template", 1344}, + {"minecraft:splash_potion", 1221}, + {"minecraft:sponge", 193}, + {"minecraft:spore_blossom", 246}, + {"minecraft:spruce_boat", 812}, + {"minecraft:spruce_button", 715}, + {"minecraft:spruce_chest_boat", 813}, + {"minecraft:spruce_door", 744}, + {"minecraft:spruce_fence", 333}, + {"minecraft:spruce_fence_gate", 785}, + {"minecraft:spruce_hanging_sign", 939}, + {"minecraft:spruce_leaves", 183}, + {"minecraft:spruce_log", 135}, + {"minecraft:spruce_planks", 37}, + {"minecraft:spruce_pressure_plate", 731}, + {"minecraft:spruce_sapling", 50}, + {"minecraft:spruce_sign", 927}, + {"minecraft:spruce_slab", 271}, + {"minecraft:spruce_stairs", 413}, + {"minecraft:spruce_trapdoor", 765}, + {"minecraft:spruce_wood", 172}, + {"minecraft:spyglass", 993}, + {"minecraft:squid_spawn_egg", 1127}, + {"minecraft:stick", 888}, + {"minecraft:sticky_piston", 693}, + {"minecraft:stone", 1}, + {"minecraft:stone_axe", 866}, + {"minecraft:stone_brick_slab", 290}, + {"minecraft:stone_brick_stairs", 391}, + {"minecraft:stone_brick_wall", 434}, + {"minecraft:stone_bricks", 362}, + {"minecraft:stone_button", 712}, + {"minecraft:stone_hoe", 867}, + {"minecraft:stone_pickaxe", 865}, + {"minecraft:stone_pressure_plate", 726}, + {"minecraft:stone_shovel", 864}, + {"minecraft:stone_slab", 283}, + {"minecraft:stone_stairs", 657}, + {"minecraft:stone_sword", 863}, + {"minecraft:stonecutter", 1276}, + {"minecraft:stray_spawn_egg", 1128}, + {"minecraft:strider_spawn_egg", 1129}, + {"minecraft:string", 890}, + {"minecraft:stripped_acacia_log", 152}, + {"minecraft:stripped_acacia_wood", 163}, + {"minecraft:stripped_bamboo_block", 170}, + {"minecraft:stripped_birch_log", 150}, + {"minecraft:stripped_birch_wood", 161}, + {"minecraft:stripped_cherry_log", 153}, + {"minecraft:stripped_cherry_wood", 164}, + {"minecraft:stripped_crimson_hyphae", 168}, + {"minecraft:stripped_crimson_stem", 157}, + {"minecraft:stripped_dark_oak_log", 154}, + {"minecraft:stripped_dark_oak_wood", 165}, + {"minecraft:stripped_jungle_log", 151}, + {"minecraft:stripped_jungle_wood", 162}, + {"minecraft:stripped_mangrove_log", 156}, + {"minecraft:stripped_mangrove_wood", 167}, + {"minecraft:stripped_oak_log", 148}, + {"minecraft:stripped_oak_wood", 159}, + {"minecraft:stripped_pale_oak_log", 155}, + {"minecraft:stripped_pale_oak_wood", 166}, + {"minecraft:stripped_spruce_log", 149}, + {"minecraft:stripped_spruce_wood", 160}, + {"minecraft:stripped_warped_hyphae", 169}, + {"minecraft:stripped_warped_stem", 158}, + {"minecraft:structure_block", 830}, + {"minecraft:structure_void", 551}, + {"minecraft:sugar", 1022}, + {"minecraft:sugar_cane", 256}, + {"minecraft:sunflower", 495}, + {"minecraft:suspicious_gravel", 61}, + {"minecraft:suspicious_sand", 60}, + {"minecraft:suspicious_stew", 1255}, + {"minecraft:sweet_berries", 1280}, + {"minecraft:tadpole_bucket", 962}, + {"minecraft:tadpole_spawn_egg", 1130}, + {"minecraft:tall_dry_grass", 210}, + {"minecraft:tall_grass", 499}, + {"minecraft:target", 701}, + {"minecraft:terracotta", 492}, + {"minecraft:test_block", 832}, + {"minecraft:test_instance_block", 833}, + {"minecraft:tide_armor_trim_smithing_template", 1341}, + {"minecraft:tinted_glass", 196}, + {"minecraft:tipped_arrow", 1223}, + {"minecraft:tnt", 709}, + {"minecraft:tnt_minecart", 804}, + {"minecraft:torch", 310}, + {"minecraft:torchflower", 244}, + {"minecraft:torchflower_seeds", 1215}, + {"minecraft:totem_of_undying", 1226}, + {"minecraft:trader_llama_spawn_egg", 1131}, + {"minecraft:trapped_chest", 708}, + {"minecraft:trial_key", 1392}, + {"minecraft:trial_spawner", 1391}, + {"minecraft:trident", 1251}, + {"minecraft:tripwire_hook", 707}, + {"minecraft:tropical_fish", 997}, + {"minecraft:tropical_fish_bucket", 960}, + {"minecraft:tropical_fish_spawn_egg", 1132}, + {"minecraft:tube_coral", 629}, + {"minecraft:tube_coral_block", 624}, + {"minecraft:tube_coral_fan", 639}, + {"minecraft:tuff", 12}, + {"minecraft:tuff_brick_slab", 22}, + {"minecraft:tuff_brick_stairs", 23}, + {"minecraft:tuff_brick_wall", 24}, + {"minecraft:tuff_bricks", 21}, + {"minecraft:tuff_slab", 13}, + {"minecraft:tuff_stairs", 14}, + {"minecraft:tuff_wall", 15}, + {"minecraft:turtle_egg", 617}, + {"minecraft:turtle_helmet", 834}, + {"minecraft:turtle_scute", 835}, + {"minecraft:turtle_spawn_egg", 1133}, + {"minecraft:twisting_vines", 255}, + {"minecraft:vault", 1394}, + {"minecraft:verdant_froglight", 1328}, + {"minecraft:vex_armor_trim_smithing_template", 1340}, + {"minecraft:vex_spawn_egg", 1134}, + {"minecraft:villager_spawn_egg", 1135}, + {"minecraft:vindicator_spawn_egg", 1136}, + {"minecraft:vine", 381}, + {"minecraft:wandering_trader_spawn_egg", 1137}, + {"minecraft:ward_armor_trim_smithing_template", 1338}, + {"minecraft:warden_spawn_egg", 1138}, + {"minecraft:warped_button", 725}, + {"minecraft:warped_door", 754}, + {"minecraft:warped_fence", 343}, + {"minecraft:warped_fence_gate", 795}, + {"minecraft:warped_fungus", 250}, + {"minecraft:warped_fungus_on_a_stick", 807}, + {"minecraft:warped_hanging_sign", 949}, + {"minecraft:warped_hyphae", 181}, + {"minecraft:warped_nylium", 34}, + {"minecraft:warped_planks", 47}, + {"minecraft:warped_pressure_plate", 741}, + {"minecraft:warped_roots", 252}, + {"minecraft:warped_sign", 937}, + {"minecraft:warped_slab", 282}, + {"minecraft:warped_stairs", 424}, + {"minecraft:warped_stem", 146}, + {"minecraft:warped_trapdoor", 775}, + {"minecraft:warped_wart_block", 548}, + {"minecraft:water_bucket", 951}, + {"minecraft:waxed_chiseled_copper", 118}, + {"minecraft:waxed_copper_block", 114}, + {"minecraft:waxed_copper_bulb", 1387}, + {"minecraft:waxed_copper_door", 759}, + {"minecraft:waxed_copper_grate", 1379}, + {"minecraft:waxed_copper_trapdoor", 780}, + {"minecraft:waxed_cut_copper", 122}, + {"minecraft:waxed_cut_copper_slab", 130}, + {"minecraft:waxed_cut_copper_stairs", 126}, + {"minecraft:waxed_exposed_chiseled_copper", 119}, + {"minecraft:waxed_exposed_copper", 115}, + {"minecraft:waxed_exposed_copper_bulb", 1388}, + {"minecraft:waxed_exposed_copper_door", 760}, + {"minecraft:waxed_exposed_copper_grate", 1380}, + {"minecraft:waxed_exposed_copper_trapdoor", 781}, + {"minecraft:waxed_exposed_cut_copper", 123}, + {"minecraft:waxed_exposed_cut_copper_slab", 131}, + {"minecraft:waxed_exposed_cut_copper_stairs", 127}, + {"minecraft:waxed_oxidized_chiseled_copper", 121}, + {"minecraft:waxed_oxidized_copper", 117}, + {"minecraft:waxed_oxidized_copper_bulb", 1390}, + {"minecraft:waxed_oxidized_copper_door", 762}, + {"minecraft:waxed_oxidized_copper_grate", 1382}, + {"minecraft:waxed_oxidized_copper_trapdoor", 783}, + {"minecraft:waxed_oxidized_cut_copper", 125}, + {"minecraft:waxed_oxidized_cut_copper_slab", 133}, + {"minecraft:waxed_oxidized_cut_copper_stairs", 129}, + {"minecraft:waxed_weathered_chiseled_copper", 120}, + {"minecraft:waxed_weathered_copper", 116}, + {"minecraft:waxed_weathered_copper_bulb", 1389}, + {"minecraft:waxed_weathered_copper_door", 761}, + {"minecraft:waxed_weathered_copper_grate", 1381}, + {"minecraft:waxed_weathered_copper_trapdoor", 782}, + {"minecraft:waxed_weathered_cut_copper", 124}, + {"minecraft:waxed_weathered_cut_copper_slab", 132}, + {"minecraft:waxed_weathered_cut_copper_stairs", 128}, + {"minecraft:wayfinder_armor_trim_smithing_template", 1345}, + {"minecraft:weathered_chiseled_copper", 100}, + {"minecraft:weathered_copper", 96}, + {"minecraft:weathered_copper_bulb", 1385}, + {"minecraft:weathered_copper_door", 757}, + {"minecraft:weathered_copper_grate", 1377}, + {"minecraft:weathered_copper_trapdoor", 778}, + {"minecraft:weathered_cut_copper", 104}, + {"minecraft:weathered_cut_copper_slab", 112}, + {"minecraft:weathered_cut_copper_stairs", 108}, + {"minecraft:weeping_vines", 254}, + {"minecraft:wet_sponge", 194}, + {"minecraft:wheat", 894}, + {"minecraft:wheat_seeds", 893}, + {"minecraft:white_banner", 1196}, + {"minecraft:white_bed", 1024}, + {"minecraft:white_bundle", 975}, + {"minecraft:white_candle", 1306}, + {"minecraft:white_carpet", 476}, + {"minecraft:white_concrete", 585}, + {"minecraft:white_concrete_powder", 601}, + {"minecraft:white_dye", 1004}, + {"minecraft:white_glazed_terracotta", 569}, + {"minecraft:white_shulker_box", 553}, + {"minecraft:white_stained_glass", 501}, + {"minecraft:white_stained_glass_pane", 517}, + {"minecraft:white_terracotta", 457}, + {"minecraft:white_tulip", 238}, + {"minecraft:white_wool", 213}, + {"minecraft:wild_armor_trim_smithing_template", 1337}, + {"minecraft:wildflowers", 259}, + {"minecraft:wind_charge", 1151}, + {"minecraft:witch_spawn_egg", 1139}, + {"minecraft:wither_rose", 243}, + {"minecraft:wither_skeleton_skull", 1166}, + {"minecraft:wither_skeleton_spawn_egg", 1141}, + {"minecraft:wither_spawn_egg", 1140}, + {"minecraft:wolf_armor", 837}, + {"minecraft:wolf_spawn_egg", 1142}, + {"minecraft:wooden_axe", 861}, + {"minecraft:wooden_hoe", 862}, + {"minecraft:wooden_pickaxe", 860}, + {"minecraft:wooden_shovel", 859}, + {"minecraft:wooden_sword", 858}, + {"minecraft:writable_book", 1152}, + {"minecraft:written_book", 1153}, + {"minecraft:yellow_banner", 1200}, + {"minecraft:yellow_bed", 1028}, + {"minecraft:yellow_bundle", 979}, + {"minecraft:yellow_candle", 1310}, + {"minecraft:yellow_carpet", 480}, + {"minecraft:yellow_concrete", 589}, + {"minecraft:yellow_concrete_powder", 605}, + {"minecraft:yellow_dye", 1008}, + {"minecraft:yellow_glazed_terracotta", 573}, + {"minecraft:yellow_shulker_box", 557}, + {"minecraft:yellow_stained_glass", 505}, + {"minecraft:yellow_stained_glass_pane", 521}, + {"minecraft:yellow_terracotta", 461}, + {"minecraft:yellow_wool", 217}, + {"minecraft:zoglin_spawn_egg", 1143}, + {"minecraft:zombie_head", 1168}, + {"minecraft:zombie_horse_spawn_egg", 1146}, + {"minecraft:zombie_spawn_egg", 1145}, + {"minecraft:zombie_villager_spawn_egg", 1147}, + {"minecraft:zombified_piglin_spawn_egg", 1148}, + }; + return registry; + } + + static std::map getLootConditionType() { + static std::map registry = { + {"minecraft:all_of", 2}, + {"minecraft:any_of", 1}, + {"minecraft:block_state_property", 8}, + {"minecraft:damage_source_properties", 12}, + {"minecraft:enchantment_active_check", 18}, + {"minecraft:entity_properties", 5}, + {"minecraft:entity_scores", 7}, + {"minecraft:inverted", 0}, + {"minecraft:killed_by_player", 6}, + {"minecraft:location_check", 13}, + {"minecraft:match_tool", 9}, + {"minecraft:random_chance", 3}, + {"minecraft:random_chance_with_enchanted_bonus", 4}, + {"minecraft:reference", 15}, + {"minecraft:survives_explosion", 11}, + {"minecraft:table_bonus", 10}, + {"minecraft:time_check", 16}, + {"minecraft:value_check", 17}, + {"minecraft:weather_check", 14}, + }; + return registry; + } + + static std::map getLootFunctionType() { + static std::map registry = { + {"minecraft:apply_bonus", 19}, + {"minecraft:copy_components", 31}, + {"minecraft:copy_custom_data", 24}, + {"minecraft:copy_name", 14}, + {"minecraft:copy_state", 25}, + {"minecraft:enchant_randomly", 3}, + {"minecraft:enchant_with_levels", 2}, + {"minecraft:enchanted_count_increase", 8}, + {"minecraft:exploration_map", 12}, + {"minecraft:explosion_decay", 21}, + {"minecraft:fill_player_head", 23}, + {"minecraft:filtered", 17}, + {"minecraft:furnace_smelt", 7}, + {"minecraft:limit_count", 18}, + {"minecraft:modify_contents", 16}, + {"minecraft:reference", 29}, + {"minecraft:sequence", 30}, + {"minecraft:set_attributes", 10}, + {"minecraft:set_banner_pattern", 26}, + {"minecraft:set_book_cover", 34}, + {"minecraft:set_components", 6}, + {"minecraft:set_contents", 15}, + {"minecraft:set_count", 0}, + {"minecraft:set_custom_data", 5}, + {"minecraft:set_custom_model_data", 39}, + {"minecraft:set_damage", 9}, + {"minecraft:set_enchantments", 4}, + {"minecraft:set_firework_explosion", 33}, + {"minecraft:set_fireworks", 32}, + {"minecraft:set_instrument", 28}, + {"minecraft:set_item", 1}, + {"minecraft:set_loot_table", 20}, + {"minecraft:set_lore", 22}, + {"minecraft:set_name", 11}, + {"minecraft:set_ominous_bottle_amplifier", 38}, + {"minecraft:set_potion", 27}, + {"minecraft:set_stew_effect", 13}, + {"minecraft:set_writable_book_pages", 36}, + {"minecraft:set_written_book_pages", 35}, + {"minecraft:toggle_tooltips", 37}, + }; + return registry; + } + + static std::map getLootNbtProviderType() { + static std::map registry = { + {"minecraft:context", 1}, + {"minecraft:storage", 0}, + }; + return registry; + } + + static std::map getLootNumberProviderType() { + static std::map registry = { + {"minecraft:binomial", 2}, + {"minecraft:constant", 0}, + {"minecraft:enchantment_level", 5}, + {"minecraft:score", 3}, + {"minecraft:storage", 4}, + {"minecraft:uniform", 1}, + }; + return registry; + } + + static std::map getLootPoolEntryType() { + static std::map registry = { + {"minecraft:alternatives", 5}, + {"minecraft:dynamic", 3}, + {"minecraft:empty", 0}, + {"minecraft:group", 7}, + {"minecraft:item", 1}, + {"minecraft:loot_table", 2}, + {"minecraft:sequence", 6}, + {"minecraft:tag", 4}, + }; + return registry; + } + + static std::map getLootScoreProviderType() { + static std::map registry = { + {"minecraft:context", 1}, + {"minecraft:fixed", 0}, + }; + return registry; + } + + static std::map getMapDecorationType() { + static std::map registry = { + {"minecraft:banner_black", 25}, {"minecraft:banner_blue", 21}, + {"minecraft:banner_brown", 22}, {"minecraft:banner_cyan", 19}, + {"minecraft:banner_gray", 17}, {"minecraft:banner_green", 23}, + {"minecraft:banner_light_blue", 13}, {"minecraft:banner_light_gray", 18}, + {"minecraft:banner_lime", 15}, {"minecraft:banner_magenta", 12}, + {"minecraft:banner_orange", 11}, {"minecraft:banner_pink", 16}, + {"minecraft:banner_purple", 20}, {"minecraft:banner_red", 24}, + {"minecraft:banner_white", 10}, {"minecraft:banner_yellow", 14}, + {"minecraft:blue_marker", 3}, {"minecraft:frame", 1}, + {"minecraft:jungle_temple", 32}, {"minecraft:mansion", 8}, + {"minecraft:monument", 9}, {"minecraft:player", 0}, + {"minecraft:player_off_limits", 7}, {"minecraft:player_off_map", 6}, + {"minecraft:red_marker", 2}, {"minecraft:red_x", 26}, + {"minecraft:swamp_hut", 33}, {"minecraft:target_point", 5}, + {"minecraft:target_x", 4}, {"minecraft:trial_chambers", 34}, + {"minecraft:village_desert", 27}, {"minecraft:village_plains", 28}, + {"minecraft:village_savanna", 29}, {"minecraft:village_snowy", 30}, + {"minecraft:village_taiga", 31}, + }; + return registry; + } + + static std::map getMemoryModuleType() { + static std::map registry = { + {"minecraft:admiring_disabled", 59}, + {"minecraft:admiring_item", 56}, + {"minecraft:angry_at", 54}, + {"minecraft:ate_recently", 74}, + {"minecraft:attack_cooling_down", 16}, + {"minecraft:attack_target", 15}, + {"minecraft:avoid_target", 26}, + {"minecraft:breed_target", 18}, + {"minecraft:breeze_jump_cooldown", 99}, + {"minecraft:breeze_jump_inhaling", 104}, + {"minecraft:breeze_jump_target", 105}, + {"minecraft:breeze_leaving_water", 106}, + {"minecraft:breeze_shoot", 100}, + {"minecraft:breeze_shoot_charging", 101}, + {"minecraft:breeze_shoot_cooldown", 103}, + {"minecraft:breeze_shoot_recover", 102}, + {"minecraft:cant_reach_walk_target_since", 31}, + {"minecraft:celebrate_location", 61}, + {"minecraft:dancing", 62}, + {"minecraft:danger_detected_recently", 33}, + {"minecraft:dig_cooldown", 83}, + {"minecraft:disable_walk_to_admire_item", 58}, + {"minecraft:disturbance_location", 78}, + {"minecraft:doors_to_close", 22}, + {"minecraft:dummy", 0}, + {"minecraft:gaze_cooldown_ticks", 43}, + {"minecraft:golem_detected_recently", 32}, + {"minecraft:has_hunting_cooldown", 47}, + {"minecraft:heard_bell_time", 30}, + {"minecraft:hiding_place", 29}, + {"minecraft:home", 1}, + {"minecraft:hunted_recently", 60}, + {"minecraft:hurt_by", 24}, + {"minecraft:hurt_by_entity", 25}, + {"minecraft:interactable_doors", 21}, + {"minecraft:interaction_target", 17}, + {"minecraft:is_emerging", 81}, + {"minecraft:is_in_water", 50}, + {"minecraft:is_panicking", 52}, + {"minecraft:is_pregnant", 51}, + {"minecraft:is_sniffing", 80}, + {"minecraft:is_tempted", 44}, + {"minecraft:item_pickup_cooldown_ticks", 94}, + {"minecraft:job_site", 2}, + {"minecraft:last_slept", 34}, + {"minecraft:last_woken", 35}, + {"minecraft:last_worked_at_poi", 36}, + {"minecraft:liked_noteblock", 92}, + {"minecraft:liked_noteblock_cooldown_ticks", 93}, + {"minecraft:liked_player", 91}, + {"minecraft:long_jump_cooling_down", 45}, + {"minecraft:long_jump_mid_jump", 46}, + {"minecraft:look_target", 14}, + {"minecraft:meeting_point", 4}, + {"minecraft:mobs", 6}, + {"minecraft:nearby_adult_piglins", 66}, + {"minecraft:nearest_attackable", 28}, + {"minecraft:nearest_bed", 23}, + {"minecraft:nearest_hostile", 27}, + {"minecraft:nearest_player_holding_wanted_item", 73}, + {"minecraft:nearest_players", 9}, + {"minecraft:nearest_repellent", 75}, + {"minecraft:nearest_targetable_player_not_wearing_gold", 65}, + {"minecraft:nearest_visible_adult", 37}, + {"minecraft:nearest_visible_adult_hoglins", 68}, + {"minecraft:nearest_visible_adult_piglin", 69}, + {"minecraft:nearest_visible_adult_piglins", 67}, + {"minecraft:nearest_visible_baby_hoglin", 64}, + {"minecraft:nearest_visible_huntable_hoglin", 63}, + {"minecraft:nearest_visible_nemesis", 39}, + {"minecraft:nearest_visible_player", 10}, + {"minecraft:nearest_visible_targetable_player", 11}, + {"minecraft:nearest_visible_targetable_players", 12}, + {"minecraft:nearest_visible_wanted_item", 38}, + {"minecraft:nearest_visible_zombified", 70}, + {"minecraft:pacified", 76}, + {"minecraft:path", 20}, + {"minecraft:play_dead_ticks", 40}, + {"minecraft:potential_job_site", 3}, + {"minecraft:ram_cooldown_ticks", 48}, + {"minecraft:ram_target", 49}, + {"minecraft:recent_projectile", 79}, + {"minecraft:ride_target", 19}, + {"minecraft:roar_sound_cooldown", 84}, + {"minecraft:roar_sound_delay", 82}, + {"minecraft:roar_target", 77}, + {"minecraft:secondary_job_site", 5}, + {"minecraft:sniff_cooldown", 85}, + {"minecraft:sniffer_digging", 97}, + {"minecraft:sniffer_explored_positions", 95}, + {"minecraft:sniffer_happy", 98}, + {"minecraft:sniffer_sniffing_target", 96}, + {"minecraft:sonic_boom_cooldown", 88}, + {"minecraft:sonic_boom_sound_cooldown", 89}, + {"minecraft:sonic_boom_sound_delay", 90}, + {"minecraft:temptation_cooldown_ticks", 42}, + {"minecraft:tempting_player", 41}, + {"minecraft:time_trying_to_reach_admire_item", 57}, + {"minecraft:touch_cooldown", 86}, + {"minecraft:universal_anger", 55}, + {"minecraft:unreachable_tongue_targets", 53}, + {"minecraft:vibration_cooldown", 87}, + {"minecraft:visible_adult_hoglin_count", 72}, + {"minecraft:visible_adult_piglin_count", 71}, + {"minecraft:visible_mobs", 7}, + {"minecraft:visible_villager_babies", 8}, + {"minecraft:walk_target", 13}, + }; + return registry; + } + + static std::map getMenu() { + static std::map registry = { + {"minecraft:anvil", 8}, + {"minecraft:beacon", 9}, + {"minecraft:blast_furnace", 10}, + {"minecraft:brewing_stand", 11}, + {"minecraft:cartography_table", 23}, + {"minecraft:crafter_3x3", 7}, + {"minecraft:crafting", 12}, + {"minecraft:enchantment", 13}, + {"minecraft:furnace", 14}, + {"minecraft:generic_3x3", 6}, + {"minecraft:generic_9x1", 0}, + {"minecraft:generic_9x2", 1}, + {"minecraft:generic_9x3", 2}, + {"minecraft:generic_9x4", 3}, + {"minecraft:generic_9x5", 4}, + {"minecraft:generic_9x6", 5}, + {"minecraft:grindstone", 15}, + {"minecraft:hopper", 16}, + {"minecraft:lectern", 17}, + {"minecraft:loom", 18}, + {"minecraft:merchant", 19}, + {"minecraft:shulker_box", 20}, + {"minecraft:smithing", 21}, + {"minecraft:smoker", 22}, + {"minecraft:stonecutter", 24}, + }; + return registry; + } + + static std::map getMobEffect() { + static std::map registry = { + {"minecraft:absorption", 21}, + {"minecraft:bad_omen", 30}, + {"minecraft:blindness", 14}, + {"minecraft:conduit_power", 28}, + {"minecraft:darkness", 32}, + {"minecraft:dolphins_grace", 29}, + {"minecraft:fire_resistance", 11}, + {"minecraft:glowing", 23}, + {"minecraft:haste", 2}, + {"minecraft:health_boost", 20}, + {"minecraft:hero_of_the_village", 31}, + {"minecraft:hunger", 16}, + {"minecraft:infested", 38}, + {"minecraft:instant_damage", 6}, + {"minecraft:instant_health", 5}, + {"minecraft:invisibility", 13}, + {"minecraft:jump_boost", 7}, + {"minecraft:levitation", 24}, + {"minecraft:luck", 25}, + {"minecraft:mining_fatigue", 3}, + {"minecraft:nausea", 8}, + {"minecraft:night_vision", 15}, + {"minecraft:oozing", 37}, + {"minecraft:poison", 18}, + {"minecraft:raid_omen", 34}, + {"minecraft:regeneration", 9}, + {"minecraft:resistance", 10}, + {"minecraft:saturation", 22}, + {"minecraft:slow_falling", 27}, + {"minecraft:slowness", 1}, + {"minecraft:speed", 0}, + {"minecraft:strength", 4}, + {"minecraft:trial_omen", 33}, + {"minecraft:unluck", 26}, + {"minecraft:water_breathing", 12}, + {"minecraft:weakness", 17}, + {"minecraft:weaving", 36}, + {"minecraft:wind_charged", 35}, + {"minecraft:wither", 19}, + }; + return registry; + } + + static std::map getNumberFormatType() { + static std::map registry = { + {"minecraft:blank", 0}, + {"minecraft:fixed", 2}, + {"minecraft:styled", 1}, + }; + return registry; + } + + static std::map getParticleType() { + static std::map registry = { + {"minecraft:angry_villager", 0}, + {"minecraft:ash", 81}, + {"minecraft:block", 1}, + {"minecraft:block_crumble", 112}, + {"minecraft:block_marker", 2}, + {"minecraft:bubble", 3}, + {"minecraft:bubble_column_up", 71}, + {"minecraft:bubble_pop", 69}, + {"minecraft:campfire_cosy_smoke", 74}, + {"minecraft:campfire_signal_smoke", 75}, + {"minecraft:cherry_leaves", 33}, + {"minecraft:cloud", 4}, + {"minecraft:composter", 43}, + {"minecraft:crimson_spore", 82}, + {"minecraft:crit", 5}, + {"minecraft:current_down", 70}, + {"minecraft:damage_indicator", 6}, + {"minecraft:dolphin", 73}, + {"minecraft:dragon_breath", 7}, + {"minecraft:dripping_dripstone_lava", 92}, + {"minecraft:dripping_dripstone_water", 94}, + {"minecraft:dripping_honey", 76}, + {"minecraft:dripping_lava", 8}, + {"minecraft:dripping_obsidian_tear", 85}, + {"minecraft:dripping_water", 11}, + {"minecraft:dust", 13}, + {"minecraft:dust_color_transition", 14}, + {"minecraft:dust_pillar", 108}, + {"minecraft:dust_plume", 104}, + {"minecraft:effect", 15}, + {"minecraft:egg_crack", 103}, + {"minecraft:elder_guardian", 16}, + {"minecraft:electric_spark", 100}, + {"minecraft:enchant", 18}, + {"minecraft:enchanted_hit", 17}, + {"minecraft:end_rod", 19}, + {"minecraft:entity_effect", 20}, + {"minecraft:explosion", 22}, + {"minecraft:explosion_emitter", 21}, + {"minecraft:falling_dripstone_lava", 93}, + {"minecraft:falling_dripstone_water", 95}, + {"minecraft:falling_dust", 28}, + {"minecraft:falling_honey", 77}, + {"minecraft:falling_lava", 9}, + {"minecraft:falling_nectar", 79}, + {"minecraft:falling_obsidian_tear", 86}, + {"minecraft:falling_spore_blossom", 80}, + {"minecraft:falling_water", 12}, + {"minecraft:firefly", 113}, + {"minecraft:firework", 29}, + {"minecraft:fishing", 30}, + {"minecraft:flame", 31}, + {"minecraft:flash", 41}, + {"minecraft:glow", 97}, + {"minecraft:glow_squid_ink", 96}, + {"minecraft:gust", 23}, + {"minecraft:gust_emitter_large", 25}, + {"minecraft:gust_emitter_small", 26}, + {"minecraft:happy_villager", 42}, + {"minecraft:heart", 44}, + {"minecraft:infested", 32}, + {"minecraft:instant_effect", 45}, + {"minecraft:item", 46}, + {"minecraft:item_cobweb", 50}, + {"minecraft:item_slime", 49}, + {"minecraft:item_snowball", 51}, + {"minecraft:landing_honey", 78}, + {"minecraft:landing_lava", 10}, + {"minecraft:landing_obsidian_tear", 87}, + {"minecraft:large_smoke", 52}, + {"minecraft:lava", 53}, + {"minecraft:mycelium", 54}, + {"minecraft:nautilus", 72}, + {"minecraft:note", 55}, + {"minecraft:ominous_spawning", 109}, + {"minecraft:pale_oak_leaves", 34}, + {"minecraft:poof", 56}, + {"minecraft:portal", 57}, + {"minecraft:raid_omen", 110}, + {"minecraft:rain", 58}, + {"minecraft:reverse_portal", 88}, + {"minecraft:scrape", 101}, + {"minecraft:sculk_charge", 37}, + {"minecraft:sculk_charge_pop", 38}, + {"minecraft:sculk_soul", 36}, + {"minecraft:shriek", 102}, + {"minecraft:small_flame", 90}, + {"minecraft:small_gust", 24}, + {"minecraft:smoke", 59}, + {"minecraft:sneeze", 61}, + {"minecraft:snowflake", 91}, + {"minecraft:sonic_boom", 27}, + {"minecraft:soul", 40}, + {"minecraft:soul_fire_flame", 39}, + {"minecraft:spit", 62}, + {"minecraft:splash", 67}, + {"minecraft:spore_blossom_air", 84}, + {"minecraft:squid_ink", 63}, + {"minecraft:sweep_attack", 64}, + {"minecraft:tinted_leaves", 35}, + {"minecraft:totem_of_undying", 65}, + {"minecraft:trail", 48}, + {"minecraft:trial_omen", 111}, + {"minecraft:trial_spawner_detection", 105}, + {"minecraft:trial_spawner_detection_ominous", 106}, + {"minecraft:underwater", 66}, + {"minecraft:vault_connection", 107}, + {"minecraft:vibration", 47}, + {"minecraft:warped_spore", 83}, + {"minecraft:wax_off", 99}, + {"minecraft:wax_on", 98}, + {"minecraft:white_ash", 89}, + {"minecraft:white_smoke", 60}, + {"minecraft:witch", 68}, + }; + return registry; + } + + static std::map getPointOfInterestType() { + static std::map registry = { + {"minecraft:armorer", 0}, {"minecraft:bee_nest", 16}, {"minecraft:beehive", 15}, {"minecraft:butcher", 1}, + {"minecraft:cartographer", 2}, {"minecraft:cleric", 3}, {"minecraft:farmer", 4}, {"minecraft:fisherman", 5}, + {"minecraft:fletcher", 6}, {"minecraft:home", 13}, {"minecraft:leatherworker", 7}, {"minecraft:librarian", 8}, + {"minecraft:lightning_rod", 19}, {"minecraft:lodestone", 18}, {"minecraft:mason", 9}, {"minecraft:meeting", 14}, + {"minecraft:nether_portal", 17}, {"minecraft:shepherd", 10}, {"minecraft:toolsmith", 11}, {"minecraft:weaponsmith", 12}, + }; + return registry; + } + + static std::map getPosRuleTest() { + static std::map registry = { + {"minecraft:always_true", 0}, + {"minecraft:axis_aligned_linear_pos", 2}, + {"minecraft:linear_pos", 1}, + }; + return registry; + } + + static std::map getPositionSourceType() { + static std::map registry = { + {"minecraft:block", 0}, + {"minecraft:entity", 1}, + }; + return registry; + } + + static std::map getPotion() { + static std::map registry = { + {"minecraft:awkward", 3}, + {"minecraft:fire_resistance", 11}, + {"minecraft:harming", 26}, + {"minecraft:healing", 24}, + {"minecraft:infested", 45}, + {"minecraft:invisibility", 6}, + {"minecraft:leaping", 8}, + {"minecraft:long_fire_resistance", 12}, + {"minecraft:long_invisibility", 7}, + {"minecraft:long_leaping", 9}, + {"minecraft:long_night_vision", 5}, + {"minecraft:long_poison", 29}, + {"minecraft:long_regeneration", 32}, + {"minecraft:long_slow_falling", 41}, + {"minecraft:long_slowness", 17}, + {"minecraft:long_strength", 35}, + {"minecraft:long_swiftness", 14}, + {"minecraft:long_turtle_master", 20}, + {"minecraft:long_water_breathing", 23}, + {"minecraft:long_weakness", 38}, + {"minecraft:luck", 39}, + {"minecraft:mundane", 1}, + {"minecraft:night_vision", 4}, + {"minecraft:oozing", 44}, + {"minecraft:poison", 28}, + {"minecraft:regeneration", 31}, + {"minecraft:slow_falling", 40}, + {"minecraft:slowness", 16}, + {"minecraft:strength", 34}, + {"minecraft:strong_harming", 27}, + {"minecraft:strong_healing", 25}, + {"minecraft:strong_leaping", 10}, + {"minecraft:strong_poison", 30}, + {"minecraft:strong_regeneration", 33}, + {"minecraft:strong_slowness", 18}, + {"minecraft:strong_strength", 36}, + {"minecraft:strong_swiftness", 15}, + {"minecraft:strong_turtle_master", 21}, + {"minecraft:swiftness", 13}, + {"minecraft:thick", 2}, + {"minecraft:turtle_master", 19}, + {"minecraft:water", 0}, + {"minecraft:water_breathing", 22}, + {"minecraft:weakness", 37}, + {"minecraft:weaving", 43}, + {"minecraft:wind_charged", 42}, + }; + return registry; + } + + static std::map getRecipeBookCategory() { + static std::map registry = { + {"minecraft:blast_furnace_blocks", 7}, + {"minecraft:blast_furnace_misc", 8}, + {"minecraft:campfire", 12}, + {"minecraft:crafting_building_blocks", 0}, + {"minecraft:crafting_equipment", 2}, + {"minecraft:crafting_misc", 3}, + {"minecraft:crafting_redstone", 1}, + {"minecraft:furnace_blocks", 5}, + {"minecraft:furnace_food", 4}, + {"minecraft:furnace_misc", 6}, + {"minecraft:smithing", 11}, + {"minecraft:smoker_food", 9}, + {"minecraft:stonecutter", 10}, + }; + return registry; + } + + static std::map getRecipeDisplay() { + static std::map registry = { + {"minecraft:crafting_shaped", 1}, + {"minecraft:crafting_shapeless", 0}, + {"minecraft:furnace", 2}, + {"minecraft:smithing", 4}, + {"minecraft:stonecutter", 3}, + }; + return registry; + } + + static std::map getRecipeSerializer() { + static std::map registry = { + {"minecraft:blasting", 15}, + {"minecraft:campfire_cooking", 17}, + {"minecraft:crafting_decorated_pot", 21}, + {"minecraft:crafting_shaped", 0}, + {"minecraft:crafting_shapeless", 1}, + {"minecraft:crafting_special_armordye", 2}, + {"minecraft:crafting_special_bannerduplicate", 10}, + {"minecraft:crafting_special_bookcloning", 3}, + {"minecraft:crafting_special_firework_rocket", 6}, + {"minecraft:crafting_special_firework_star", 7}, + {"minecraft:crafting_special_firework_star_fade", 8}, + {"minecraft:crafting_special_mapcloning", 4}, + {"minecraft:crafting_special_mapextending", 5}, + {"minecraft:crafting_special_repairitem", 13}, + {"minecraft:crafting_special_shielddecoration", 11}, + {"minecraft:crafting_special_tippedarrow", 9}, + {"minecraft:crafting_transmute", 12}, + {"minecraft:smelting", 14}, + {"minecraft:smithing_transform", 19}, + {"minecraft:smithing_trim", 20}, + {"minecraft:smoking", 16}, + {"minecraft:stonecutting", 18}, + }; + return registry; + } + + static std::map getRecipeType() { + static std::map registry = { + {"minecraft:blasting", 2}, + {"minecraft:campfire_cooking", 4}, + {"minecraft:crafting", 0}, + {"minecraft:smelting", 1}, + {"minecraft:smithing", 6}, + {"minecraft:smoking", 3}, + {"minecraft:stonecutting", 5}, + }; + return registry; + } + + static std::map getRuleBlockEntityModifier() { + static std::map registry = { + {"minecraft:append_loot", 3}, + {"minecraft:append_static", 2}, + {"minecraft:clear", 0}, + {"minecraft:passthrough", 1}, + }; + return registry; + } + + static std::map getRuleTest() { + static std::map registry = { + {"minecraft:always_true", 0}, + {"minecraft:block_match", 1}, + {"minecraft:blockstate_match", 2}, + {"minecraft:random_block_match", 4}, + {"minecraft:random_blockstate_match", 5}, + {"minecraft:tag_match", 3}, + }; + return registry; + } + + static std::map getSchedule() { + static std::map registry = { + {"minecraft:empty", 0}, + {"minecraft:simple", 1}, + {"minecraft:villager_baby", 2}, + {"minecraft:villager_default", 3}, + }; + return registry; + } + + static std::map getSensorType() { + static std::map registry = { + {"minecraft:armadillo_scare_detected", 10}, + {"minecraft:armadillo_temptations", 20}, + {"minecraft:axolotl_attackables", 15}, + {"minecraft:axolotl_temptations", 16}, + {"minecraft:breeze_attack_entity_sensor", 25}, + {"minecraft:camel_temptations", 19}, + {"minecraft:dummy", 0}, + {"minecraft:frog_attackables", 21}, + {"minecraft:frog_temptations", 18}, + {"minecraft:goat_temptations", 17}, + {"minecraft:golem_detected", 9}, + {"minecraft:hoglin_specific_sensor", 13}, + {"minecraft:hurt_by", 5}, + {"minecraft:is_in_water", 22}, + {"minecraft:nearest_adult", 14}, + {"minecraft:nearest_bed", 4}, + {"minecraft:nearest_items", 1}, + {"minecraft:nearest_living_entities", 2}, + {"minecraft:nearest_players", 3}, + {"minecraft:piglin_brute_specific_sensor", 12}, + {"minecraft:piglin_specific_sensor", 11}, + {"minecraft:secondary_pois", 8}, + {"minecraft:sniffer_temptations", 24}, + {"minecraft:villager_babies", 7}, + {"minecraft:villager_hostiles", 6}, + {"minecraft:warden_entity_sensor", 23}, + }; + return registry; + } + + static std::map getSlotDisplay() { + static std::map registry = { + {"minecraft:any_fuel", 1}, + {"minecraft:composite", 7}, + {"minecraft:empty", 0}, + {"minecraft:item", 2}, + {"minecraft:item_stack", 3}, + {"minecraft:smithing_trim", 5}, + {"minecraft:tag", 4}, + {"minecraft:with_remainder", 6}, + }; + return registry; + } + + static std::map getSoundEvent() { + static std::map registry = { + {"minecraft:ambient.basalt_deltas.additions", 8}, + {"minecraft:ambient.basalt_deltas.loop", 9}, + {"minecraft:ambient.basalt_deltas.mood", 10}, + {"minecraft:ambient.cave", 7}, + {"minecraft:ambient.crimson_forest.additions", 11}, + {"minecraft:ambient.crimson_forest.loop", 12}, + {"minecraft:ambient.crimson_forest.mood", 13}, + {"minecraft:ambient.nether_wastes.additions", 14}, + {"minecraft:ambient.nether_wastes.loop", 15}, + {"minecraft:ambient.nether_wastes.mood", 16}, + {"minecraft:ambient.soul_sand_valley.additions", 17}, + {"minecraft:ambient.soul_sand_valley.loop", 18}, + {"minecraft:ambient.soul_sand_valley.mood", 19}, + {"minecraft:ambient.underwater.enter", 23}, + {"minecraft:ambient.underwater.exit", 24}, + {"minecraft:ambient.underwater.loop", 25}, + {"minecraft:ambient.underwater.loop.additions", 26}, + {"minecraft:ambient.underwater.loop.additions.rare", 27}, + {"minecraft:ambient.underwater.loop.additions.ultra_rare", 28}, + {"minecraft:ambient.warped_forest.additions", 20}, + {"minecraft:ambient.warped_forest.loop", 21}, + {"minecraft:ambient.warped_forest.mood", 22}, + {"minecraft:block.amethyst_block.break", 29}, + {"minecraft:block.amethyst_block.chime", 30}, + {"minecraft:block.amethyst_block.fall", 31}, + {"minecraft:block.amethyst_block.hit", 32}, + {"minecraft:block.amethyst_block.place", 33}, + {"minecraft:block.amethyst_block.resonate", 34}, + {"minecraft:block.amethyst_block.step", 35}, + {"minecraft:block.amethyst_cluster.break", 36}, + {"minecraft:block.amethyst_cluster.fall", 37}, + {"minecraft:block.amethyst_cluster.hit", 38}, + {"minecraft:block.amethyst_cluster.place", 39}, + {"minecraft:block.amethyst_cluster.step", 40}, + {"minecraft:block.ancient_debris.break", 41}, + {"minecraft:block.ancient_debris.fall", 45}, + {"minecraft:block.ancient_debris.hit", 44}, + {"minecraft:block.ancient_debris.place", 43}, + {"minecraft:block.ancient_debris.step", 42}, + {"minecraft:block.anvil.break", 46}, + {"minecraft:block.anvil.destroy", 47}, + {"minecraft:block.anvil.fall", 48}, + {"minecraft:block.anvil.hit", 49}, + {"minecraft:block.anvil.land", 50}, + {"minecraft:block.anvil.place", 51}, + {"minecraft:block.anvil.step", 52}, + {"minecraft:block.anvil.use", 53}, + {"minecraft:block.azalea.break", 95}, + {"minecraft:block.azalea.fall", 96}, + {"minecraft:block.azalea.hit", 97}, + {"minecraft:block.azalea.place", 98}, + {"minecraft:block.azalea.step", 99}, + {"minecraft:block.azalea_leaves.break", 100}, + {"minecraft:block.azalea_leaves.fall", 101}, + {"minecraft:block.azalea_leaves.hit", 102}, + {"minecraft:block.azalea_leaves.place", 103}, + {"minecraft:block.azalea_leaves.step", 104}, + {"minecraft:block.bamboo.break", 105}, + {"minecraft:block.bamboo.fall", 106}, + {"minecraft:block.bamboo.hit", 107}, + {"minecraft:block.bamboo.place", 108}, + {"minecraft:block.bamboo.step", 109}, + {"minecraft:block.bamboo_sapling.break", 110}, + {"minecraft:block.bamboo_sapling.hit", 111}, + {"minecraft:block.bamboo_sapling.place", 112}, + {"minecraft:block.bamboo_wood.break", 113}, + {"minecraft:block.bamboo_wood.fall", 114}, + {"minecraft:block.bamboo_wood.hit", 115}, + {"minecraft:block.bamboo_wood.place", 116}, + {"minecraft:block.bamboo_wood.step", 117}, + {"minecraft:block.bamboo_wood_button.click_off", 122}, + {"minecraft:block.bamboo_wood_button.click_on", 123}, + {"minecraft:block.bamboo_wood_door.close", 118}, + {"minecraft:block.bamboo_wood_door.open", 119}, + {"minecraft:block.bamboo_wood_fence_gate.close", 126}, + {"minecraft:block.bamboo_wood_fence_gate.open", 127}, + {"minecraft:block.bamboo_wood_hanging_sign.break", 697}, + {"minecraft:block.bamboo_wood_hanging_sign.fall", 698}, + {"minecraft:block.bamboo_wood_hanging_sign.hit", 699}, + {"minecraft:block.bamboo_wood_hanging_sign.place", 700}, + {"minecraft:block.bamboo_wood_hanging_sign.step", 696}, + {"minecraft:block.bamboo_wood_pressure_plate.click_off", 124}, + {"minecraft:block.bamboo_wood_pressure_plate.click_on", 125}, + {"minecraft:block.bamboo_wood_trapdoor.close", 120}, + {"minecraft:block.bamboo_wood_trapdoor.open", 121}, + {"minecraft:block.barrel.close", 128}, + {"minecraft:block.barrel.open", 129}, + {"minecraft:block.basalt.break", 130}, + {"minecraft:block.basalt.fall", 134}, + {"minecraft:block.basalt.hit", 133}, + {"minecraft:block.basalt.place", 132}, + {"minecraft:block.basalt.step", 131}, + {"minecraft:block.beacon.activate", 140}, + {"minecraft:block.beacon.ambient", 141}, + {"minecraft:block.beacon.deactivate", 142}, + {"minecraft:block.beacon.power_select", 143}, + {"minecraft:block.beehive.drip", 150}, + {"minecraft:block.beehive.enter", 151}, + {"minecraft:block.beehive.exit", 152}, + {"minecraft:block.beehive.shear", 153}, + {"minecraft:block.beehive.work", 154}, + {"minecraft:block.bell.resonate", 156}, + {"minecraft:block.bell.use", 155}, + {"minecraft:block.big_dripleaf.break", 157}, + {"minecraft:block.big_dripleaf.fall", 158}, + {"minecraft:block.big_dripleaf.hit", 159}, + {"minecraft:block.big_dripleaf.place", 160}, + {"minecraft:block.big_dripleaf.step", 161}, + {"minecraft:block.big_dripleaf.tilt_down", 467}, + {"minecraft:block.big_dripleaf.tilt_up", 468}, + {"minecraft:block.blastfurnace.fire_crackle", 182}, + {"minecraft:block.bone_block.break", 174}, + {"minecraft:block.bone_block.fall", 175}, + {"minecraft:block.bone_block.hit", 176}, + {"minecraft:block.bone_block.place", 177}, + {"minecraft:block.bone_block.step", 178}, + {"minecraft:block.brewing_stand.brew", 199}, + {"minecraft:block.bubble_column.bubble_pop", 205}, + {"minecraft:block.bubble_column.upwards_ambient", 206}, + {"minecraft:block.bubble_column.upwards_inside", 207}, + {"minecraft:block.bubble_column.whirlpool_ambient", 208}, + {"minecraft:block.bubble_column.whirlpool_inside", 209}, + {"minecraft:block.cactus_flower.break", 227}, + {"minecraft:block.cactus_flower.place", 228}, + {"minecraft:block.cake.add_candle", 229}, + {"minecraft:block.calcite.break", 230}, + {"minecraft:block.calcite.fall", 234}, + {"minecraft:block.calcite.hit", 233}, + {"minecraft:block.calcite.place", 232}, + {"minecraft:block.calcite.step", 231}, + {"minecraft:block.campfire.crackle", 246}, + {"minecraft:block.candle.ambient", 247}, + {"minecraft:block.candle.break", 248}, + {"minecraft:block.candle.extinguish", 249}, + {"minecraft:block.candle.fall", 250}, + {"minecraft:block.candle.hit", 251}, + {"minecraft:block.candle.place", 252}, + {"minecraft:block.candle.step", 253}, + {"minecraft:block.cave_vines.break", 263}, + {"minecraft:block.cave_vines.fall", 264}, + {"minecraft:block.cave_vines.hit", 265}, + {"minecraft:block.cave_vines.pick_berries", 268}, + {"minecraft:block.cave_vines.place", 266}, + {"minecraft:block.cave_vines.step", 267}, + {"minecraft:block.chain.break", 269}, + {"minecraft:block.chain.fall", 270}, + {"minecraft:block.chain.hit", 271}, + {"minecraft:block.chain.place", 272}, + {"minecraft:block.chain.step", 273}, + {"minecraft:block.cherry_leaves.break", 284}, + {"minecraft:block.cherry_leaves.fall", 285}, + {"minecraft:block.cherry_leaves.hit", 286}, + {"minecraft:block.cherry_leaves.place", 287}, + {"minecraft:block.cherry_leaves.step", 288}, + {"minecraft:block.cherry_sapling.break", 279}, + {"minecraft:block.cherry_sapling.fall", 280}, + {"minecraft:block.cherry_sapling.hit", 281}, + {"minecraft:block.cherry_sapling.place", 282}, + {"minecraft:block.cherry_sapling.step", 283}, + {"minecraft:block.cherry_wood.break", 274}, + {"minecraft:block.cherry_wood.fall", 275}, + {"minecraft:block.cherry_wood.hit", 276}, + {"minecraft:block.cherry_wood.place", 277}, + {"minecraft:block.cherry_wood.step", 278}, + {"minecraft:block.cherry_wood_button.click_off", 298}, + {"minecraft:block.cherry_wood_button.click_on", 299}, + {"minecraft:block.cherry_wood_door.close", 294}, + {"minecraft:block.cherry_wood_door.open", 295}, + {"minecraft:block.cherry_wood_fence_gate.close", 302}, + {"minecraft:block.cherry_wood_fence_gate.open", 303}, + {"minecraft:block.cherry_wood_hanging_sign.break", 290}, + {"minecraft:block.cherry_wood_hanging_sign.fall", 291}, + {"minecraft:block.cherry_wood_hanging_sign.hit", 292}, + {"minecraft:block.cherry_wood_hanging_sign.place", 293}, + {"minecraft:block.cherry_wood_hanging_sign.step", 289}, + {"minecraft:block.cherry_wood_pressure_plate.click_off", 300}, + {"minecraft:block.cherry_wood_pressure_plate.click_on", 301}, + {"minecraft:block.cherry_wood_trapdoor.close", 296}, + {"minecraft:block.cherry_wood_trapdoor.open", 297}, + {"minecraft:block.chest.close", 304}, + {"minecraft:block.chest.locked", 305}, + {"minecraft:block.chest.open", 306}, + {"minecraft:block.chiseled_bookshelf.break", 312}, + {"minecraft:block.chiseled_bookshelf.fall", 313}, + {"minecraft:block.chiseled_bookshelf.hit", 314}, + {"minecraft:block.chiseled_bookshelf.insert", 315}, + {"minecraft:block.chiseled_bookshelf.insert.enchanted", 316}, + {"minecraft:block.chiseled_bookshelf.pickup", 318}, + {"minecraft:block.chiseled_bookshelf.pickup.enchanted", 319}, + {"minecraft:block.chiseled_bookshelf.place", 320}, + {"minecraft:block.chiseled_bookshelf.step", 317}, + {"minecraft:block.chorus_flower.death", 321}, + {"minecraft:block.chorus_flower.grow", 322}, + {"minecraft:block.cobweb.break", 324}, + {"minecraft:block.cobweb.fall", 328}, + {"minecraft:block.cobweb.hit", 327}, + {"minecraft:block.cobweb.place", 326}, + {"minecraft:block.cobweb.step", 325}, + {"minecraft:block.comparator.click", 333}, + {"minecraft:block.composter.empty", 334}, + {"minecraft:block.composter.fill", 335}, + {"minecraft:block.composter.fill_success", 336}, + {"minecraft:block.composter.ready", 337}, + {"minecraft:block.conduit.activate", 338}, + {"minecraft:block.conduit.ambient", 339}, + {"minecraft:block.conduit.ambient.short", 340}, + {"minecraft:block.conduit.attack.target", 341}, + {"minecraft:block.conduit.deactivate", 342}, + {"minecraft:block.copper.break", 350}, + {"minecraft:block.copper.fall", 354}, + {"minecraft:block.copper.hit", 353}, + {"minecraft:block.copper.place", 352}, + {"minecraft:block.copper.step", 351}, + {"minecraft:block.copper_bulb.break", 343}, + {"minecraft:block.copper_bulb.fall", 347}, + {"minecraft:block.copper_bulb.hit", 346}, + {"minecraft:block.copper_bulb.place", 345}, + {"minecraft:block.copper_bulb.step", 344}, + {"minecraft:block.copper_bulb.turn_off", 349}, + {"minecraft:block.copper_bulb.turn_on", 348}, + {"minecraft:block.copper_door.close", 355}, + {"minecraft:block.copper_door.open", 356}, + {"minecraft:block.copper_grate.break", 357}, + {"minecraft:block.copper_grate.fall", 361}, + {"minecraft:block.copper_grate.hit", 360}, + {"minecraft:block.copper_grate.place", 359}, + {"minecraft:block.copper_grate.step", 358}, + {"minecraft:block.copper_trapdoor.close", 362}, + {"minecraft:block.copper_trapdoor.open", 363}, + {"minecraft:block.coral_block.break", 364}, + {"minecraft:block.coral_block.fall", 365}, + {"minecraft:block.coral_block.hit", 366}, + {"minecraft:block.coral_block.place", 367}, + {"minecraft:block.coral_block.step", 368}, + {"minecraft:block.crafter.craft", 374}, + {"minecraft:block.crafter.fail", 375}, + {"minecraft:block.creaking_heart.break", 387}, + {"minecraft:block.creaking_heart.fall", 388}, + {"minecraft:block.creaking_heart.hit", 389}, + {"minecraft:block.creaking_heart.hurt", 390}, + {"minecraft:block.creaking_heart.idle", 393}, + {"minecraft:block.creaking_heart.place", 391}, + {"minecraft:block.creaking_heart.spawn", 394}, + {"minecraft:block.creaking_heart.step", 392}, + {"minecraft:block.crop.break", 398}, + {"minecraft:block.deadbush.idle", 408}, + {"minecraft:block.decorated_pot.break", 409}, + {"minecraft:block.decorated_pot.fall", 410}, + {"minecraft:block.decorated_pot.hit", 411}, + {"minecraft:block.decorated_pot.insert", 412}, + {"minecraft:block.decorated_pot.insert_fail", 413}, + {"minecraft:block.decorated_pot.place", 415}, + {"minecraft:block.decorated_pot.shatter", 416}, + {"minecraft:block.decorated_pot.step", 414}, + {"minecraft:block.deepslate.break", 422}, + {"minecraft:block.deepslate.fall", 423}, + {"minecraft:block.deepslate.hit", 424}, + {"minecraft:block.deepslate.place", 425}, + {"minecraft:block.deepslate.step", 426}, + {"minecraft:block.deepslate_bricks.break", 417}, + {"minecraft:block.deepslate_bricks.fall", 418}, + {"minecraft:block.deepslate_bricks.hit", 419}, + {"minecraft:block.deepslate_bricks.place", 420}, + {"minecraft:block.deepslate_bricks.step", 421}, + {"minecraft:block.deepslate_tiles.break", 427}, + {"minecraft:block.deepslate_tiles.fall", 428}, + {"minecraft:block.deepslate_tiles.hit", 429}, + {"minecraft:block.deepslate_tiles.place", 430}, + {"minecraft:block.deepslate_tiles.step", 431}, + {"minecraft:block.dispenser.dispense", 432}, + {"minecraft:block.dispenser.fail", 433}, + {"minecraft:block.dispenser.launch", 434}, + {"minecraft:block.dripstone_block.break", 452}, + {"minecraft:block.dripstone_block.fall", 456}, + {"minecraft:block.dripstone_block.hit", 455}, + {"minecraft:block.dripstone_block.place", 454}, + {"minecraft:block.dripstone_block.step", 453}, + {"minecraft:block.enchantment_table.use", 489}, + {"minecraft:block.end_gateway.spawn", 512}, + {"minecraft:block.end_portal.spawn", 514}, + {"minecraft:block.end_portal_frame.fill", 513}, + {"minecraft:block.ender_chest.close", 490}, + {"minecraft:block.ender_chest.open", 491}, + {"minecraft:block.eyeblossom.close", 529}, + {"minecraft:block.eyeblossom.close_long", 528}, + {"minecraft:block.eyeblossom.idle", 530}, + {"minecraft:block.eyeblossom.open", 527}, + {"minecraft:block.eyeblossom.open_long", 526}, + {"minecraft:block.fence_gate.close", 531}, + {"minecraft:block.fence_gate.open", 532}, + {"minecraft:block.fire.ambient", 543}, + {"minecraft:block.fire.extinguish", 544}, + {"minecraft:block.firefly_bush.idle", 534}, + {"minecraft:block.flowering_azalea.break", 550}, + {"minecraft:block.flowering_azalea.fall", 551}, + {"minecraft:block.flowering_azalea.hit", 552}, + {"minecraft:block.flowering_azalea.place", 553}, + {"minecraft:block.flowering_azalea.step", 554}, + {"minecraft:block.froglight.break", 576}, + {"minecraft:block.froglight.fall", 577}, + {"minecraft:block.froglight.hit", 578}, + {"minecraft:block.froglight.place", 579}, + {"minecraft:block.froglight.step", 580}, + {"minecraft:block.frogspawn.break", 582}, + {"minecraft:block.frogspawn.fall", 583}, + {"minecraft:block.frogspawn.hatch", 584}, + {"minecraft:block.frogspawn.hit", 585}, + {"minecraft:block.frogspawn.place", 586}, + {"minecraft:block.frogspawn.step", 581}, + {"minecraft:block.fungus.break", 999}, + {"minecraft:block.fungus.fall", 1003}, + {"minecraft:block.fungus.hit", 1002}, + {"minecraft:block.fungus.place", 1001}, + {"minecraft:block.fungus.step", 1000}, + {"minecraft:block.furnace.fire_crackle", 600}, + {"minecraft:block.gilded_blackstone.break", 618}, + {"minecraft:block.gilded_blackstone.fall", 619}, + {"minecraft:block.gilded_blackstone.hit", 620}, + {"minecraft:block.gilded_blackstone.place", 621}, + {"minecraft:block.gilded_blackstone.step", 622}, + {"minecraft:block.glass.break", 623}, + {"minecraft:block.glass.fall", 624}, + {"minecraft:block.glass.hit", 625}, + {"minecraft:block.glass.place", 626}, + {"minecraft:block.glass.step", 627}, + {"minecraft:block.grass.break", 656}, + {"minecraft:block.grass.fall", 657}, + {"minecraft:block.grass.hit", 658}, + {"minecraft:block.grass.place", 659}, + {"minecraft:block.grass.step", 660}, + {"minecraft:block.gravel.break", 661}, + {"minecraft:block.gravel.fall", 662}, + {"minecraft:block.gravel.hit", 663}, + {"minecraft:block.gravel.place", 664}, + {"minecraft:block.gravel.step", 665}, + {"minecraft:block.grindstone.use", 666}, + {"minecraft:block.growing_plant.crop", 667}, + {"minecraft:block.hanging_roots.break", 676}, + {"minecraft:block.hanging_roots.fall", 677}, + {"minecraft:block.hanging_roots.hit", 678}, + {"minecraft:block.hanging_roots.place", 679}, + {"minecraft:block.hanging_roots.step", 680}, + {"minecraft:block.hanging_sign.break", 682}, + {"minecraft:block.hanging_sign.fall", 683}, + {"minecraft:block.hanging_sign.hit", 684}, + {"minecraft:block.hanging_sign.place", 685}, + {"minecraft:block.hanging_sign.step", 681}, + {"minecraft:block.hanging_sign.waxed_interact_fail", 1570}, + {"minecraft:block.heavy_core.break", 686}, + {"minecraft:block.heavy_core.fall", 687}, + {"minecraft:block.heavy_core.hit", 688}, + {"minecraft:block.heavy_core.place", 689}, + {"minecraft:block.heavy_core.step", 690}, + {"minecraft:block.honey_block.break", 726}, + {"minecraft:block.honey_block.fall", 727}, + {"minecraft:block.honey_block.hit", 728}, + {"minecraft:block.honey_block.place", 729}, + {"minecraft:block.honey_block.slide", 730}, + {"minecraft:block.honey_block.step", 731}, + {"minecraft:block.iron.break", 774}, + {"minecraft:block.iron.fall", 778}, + {"minecraft:block.iron.hit", 777}, + {"minecraft:block.iron.place", 776}, + {"minecraft:block.iron.step", 775}, + {"minecraft:block.iron_door.close", 779}, + {"minecraft:block.iron_door.open", 780}, + {"minecraft:block.iron_trapdoor.close", 787}, + {"minecraft:block.iron_trapdoor.open", 788}, + {"minecraft:block.ladder.break", 796}, + {"minecraft:block.ladder.fall", 797}, + {"minecraft:block.ladder.hit", 798}, + {"minecraft:block.ladder.place", 799}, + {"minecraft:block.ladder.step", 800}, + {"minecraft:block.lantern.break", 801}, + {"minecraft:block.lantern.fall", 802}, + {"minecraft:block.lantern.hit", 803}, + {"minecraft:block.lantern.place", 804}, + {"minecraft:block.lantern.step", 805}, + {"minecraft:block.large_amethyst_bud.break", 806}, + {"minecraft:block.large_amethyst_bud.place", 807}, + {"minecraft:block.lava.ambient", 808}, + {"minecraft:block.lava.extinguish", 809}, + {"minecraft:block.lava.pop", 810}, + {"minecraft:block.leaf_litter.break", 811}, + {"minecraft:block.leaf_litter.fall", 815}, + {"minecraft:block.leaf_litter.hit", 814}, + {"minecraft:block.leaf_litter.place", 813}, + {"minecraft:block.leaf_litter.step", 812}, + {"minecraft:block.lever.click", 818}, + {"minecraft:block.lily_pad.place", 1539}, + {"minecraft:block.lodestone.break", 832}, + {"minecraft:block.lodestone.fall", 836}, + {"minecraft:block.lodestone.hit", 835}, + {"minecraft:block.lodestone.place", 834}, + {"minecraft:block.lodestone.step", 833}, + {"minecraft:block.mangrove_roots.break", 847}, + {"minecraft:block.mangrove_roots.fall", 848}, + {"minecraft:block.mangrove_roots.hit", 849}, + {"minecraft:block.mangrove_roots.place", 850}, + {"minecraft:block.mangrove_roots.step", 851}, + {"minecraft:block.medium_amethyst_bud.break", 852}, + {"minecraft:block.medium_amethyst_bud.place", 853}, + {"minecraft:block.metal.break", 854}, + {"minecraft:block.metal.fall", 855}, + {"minecraft:block.metal.hit", 856}, + {"minecraft:block.metal.place", 857}, + {"minecraft:block.metal.step", 860}, + {"minecraft:block.metal_pressure_plate.click_off", 858}, + {"minecraft:block.metal_pressure_plate.click_on", 859}, + {"minecraft:block.moss.break", 879}, + {"minecraft:block.moss.fall", 880}, + {"minecraft:block.moss.hit", 881}, + {"minecraft:block.moss.place", 882}, + {"minecraft:block.moss.step", 883}, + {"minecraft:block.moss_carpet.break", 869}, + {"minecraft:block.moss_carpet.fall", 870}, + {"minecraft:block.moss_carpet.hit", 871}, + {"minecraft:block.moss_carpet.place", 872}, + {"minecraft:block.moss_carpet.step", 873}, + {"minecraft:block.mud.break", 884}, + {"minecraft:block.mud.fall", 885}, + {"minecraft:block.mud.hit", 886}, + {"minecraft:block.mud.place", 887}, + {"minecraft:block.mud.step", 888}, + {"minecraft:block.mud_bricks.break", 889}, + {"minecraft:block.mud_bricks.fall", 890}, + {"minecraft:block.mud_bricks.hit", 891}, + {"minecraft:block.mud_bricks.place", 892}, + {"minecraft:block.mud_bricks.step", 893}, + {"minecraft:block.muddy_mangrove_roots.break", 894}, + {"minecraft:block.muddy_mangrove_roots.fall", 895}, + {"minecraft:block.muddy_mangrove_roots.hit", 896}, + {"minecraft:block.muddy_mangrove_roots.place", 897}, + {"minecraft:block.muddy_mangrove_roots.step", 898}, + {"minecraft:block.nether_bricks.break", 956}, + {"minecraft:block.nether_bricks.fall", 960}, + {"minecraft:block.nether_bricks.hit", 959}, + {"minecraft:block.nether_bricks.place", 958}, + {"minecraft:block.nether_bricks.step", 957}, + {"minecraft:block.nether_gold_ore.break", 1201}, + {"minecraft:block.nether_gold_ore.fall", 1202}, + {"minecraft:block.nether_gold_ore.hit", 1203}, + {"minecraft:block.nether_gold_ore.place", 1204}, + {"minecraft:block.nether_gold_ore.step", 1205}, + {"minecraft:block.nether_ore.break", 1206}, + {"minecraft:block.nether_ore.fall", 1207}, + {"minecraft:block.nether_ore.hit", 1208}, + {"minecraft:block.nether_ore.place", 1209}, + {"minecraft:block.nether_ore.step", 1210}, + {"minecraft:block.nether_sprouts.break", 994}, + {"minecraft:block.nether_sprouts.fall", 998}, + {"minecraft:block.nether_sprouts.hit", 997}, + {"minecraft:block.nether_sprouts.place", 996}, + {"minecraft:block.nether_sprouts.step", 995}, + {"minecraft:block.nether_wart.break", 961}, + {"minecraft:block.nether_wood.break", 963}, + {"minecraft:block.nether_wood.fall", 964}, + {"minecraft:block.nether_wood.hit", 965}, + {"minecraft:block.nether_wood.place", 966}, + {"minecraft:block.nether_wood.step", 967}, + {"minecraft:block.nether_wood_button.click_off", 972}, + {"minecraft:block.nether_wood_button.click_on", 973}, + {"minecraft:block.nether_wood_door.close", 968}, + {"minecraft:block.nether_wood_door.open", 969}, + {"minecraft:block.nether_wood_fence_gate.close", 976}, + {"minecraft:block.nether_wood_fence_gate.open", 977}, + {"minecraft:block.nether_wood_hanging_sign.break", 692}, + {"minecraft:block.nether_wood_hanging_sign.fall", 693}, + {"minecraft:block.nether_wood_hanging_sign.hit", 694}, + {"minecraft:block.nether_wood_hanging_sign.place", 695}, + {"minecraft:block.nether_wood_hanging_sign.step", 691}, + {"minecraft:block.nether_wood_pressure_plate.click_off", 974}, + {"minecraft:block.nether_wood_pressure_plate.click_on", 975}, + {"minecraft:block.nether_wood_trapdoor.close", 970}, + {"minecraft:block.nether_wood_trapdoor.open", 971}, + {"minecraft:block.netherite_block.break", 1014}, + {"minecraft:block.netherite_block.fall", 1018}, + {"minecraft:block.netherite_block.hit", 1017}, + {"minecraft:block.netherite_block.place", 1016}, + {"minecraft:block.netherite_block.step", 1015}, + {"minecraft:block.netherrack.break", 1019}, + {"minecraft:block.netherrack.fall", 1023}, + {"minecraft:block.netherrack.hit", 1022}, + {"minecraft:block.netherrack.place", 1021}, + {"minecraft:block.netherrack.step", 1020}, + {"minecraft:block.note_block.banjo", 1039}, + {"minecraft:block.note_block.basedrum", 1024}, + {"minecraft:block.note_block.bass", 1025}, + {"minecraft:block.note_block.bell", 1026}, + {"minecraft:block.note_block.bit", 1038}, + {"minecraft:block.note_block.chime", 1027}, + {"minecraft:block.note_block.cow_bell", 1036}, + {"minecraft:block.note_block.didgeridoo", 1037}, + {"minecraft:block.note_block.flute", 1028}, + {"minecraft:block.note_block.guitar", 1029}, + {"minecraft:block.note_block.harp", 1030}, + {"minecraft:block.note_block.hat", 1031}, + {"minecraft:block.note_block.imitate.creeper", 1042}, + {"minecraft:block.note_block.imitate.ender_dragon", 1043}, + {"minecraft:block.note_block.imitate.piglin", 1045}, + {"minecraft:block.note_block.imitate.skeleton", 1041}, + {"minecraft:block.note_block.imitate.wither_skeleton", 1044}, + {"minecraft:block.note_block.imitate.zombie", 1040}, + {"minecraft:block.note_block.iron_xylophone", 1035}, + {"minecraft:block.note_block.pling", 1032}, + {"minecraft:block.note_block.snare", 1033}, + {"minecraft:block.note_block.xylophone", 1034}, + {"minecraft:block.nylium.break", 989}, + {"minecraft:block.nylium.fall", 993}, + {"minecraft:block.nylium.hit", 992}, + {"minecraft:block.nylium.place", 991}, + {"minecraft:block.nylium.step", 990}, + {"minecraft:block.packed_mud.break", 979}, + {"minecraft:block.packed_mud.fall", 980}, + {"minecraft:block.packed_mud.hit", 981}, + {"minecraft:block.packed_mud.place", 982}, + {"minecraft:block.packed_mud.step", 983}, + {"minecraft:block.pale_hanging_moss.idle", 1052}, + {"minecraft:block.pink_petals.break", 874}, + {"minecraft:block.pink_petals.fall", 875}, + {"minecraft:block.pink_petals.hit", 876}, + {"minecraft:block.pink_petals.place", 877}, + {"minecraft:block.pink_petals.step", 878}, + {"minecraft:block.piston.contract", 1137}, + {"minecraft:block.piston.extend", 1138}, + {"minecraft:block.pointed_dripstone.break", 457}, + {"minecraft:block.pointed_dripstone.drip_lava", 463}, + {"minecraft:block.pointed_dripstone.drip_lava_into_cauldron", 465}, + {"minecraft:block.pointed_dripstone.drip_water", 464}, + {"minecraft:block.pointed_dripstone.drip_water_into_cauldron", 466}, + {"minecraft:block.pointed_dripstone.fall", 461}, + {"minecraft:block.pointed_dripstone.hit", 460}, + {"minecraft:block.pointed_dripstone.land", 462}, + {"minecraft:block.pointed_dripstone.place", 459}, + {"minecraft:block.pointed_dripstone.step", 458}, + {"minecraft:block.polished_deepslate.break", 1166}, + {"minecraft:block.polished_deepslate.fall", 1167}, + {"minecraft:block.polished_deepslate.hit", 1168}, + {"minecraft:block.polished_deepslate.place", 1169}, + {"minecraft:block.polished_deepslate.step", 1170}, + {"minecraft:block.polished_tuff.break", 1466}, + {"minecraft:block.polished_tuff.fall", 1467}, + {"minecraft:block.polished_tuff.hit", 1468}, + {"minecraft:block.polished_tuff.place", 1469}, + {"minecraft:block.polished_tuff.step", 1470}, + {"minecraft:block.portal.ambient", 1171}, + {"minecraft:block.portal.travel", 1172}, + {"minecraft:block.portal.trigger", 1173}, + {"minecraft:block.powder_snow.break", 1174}, + {"minecraft:block.powder_snow.fall", 1175}, + {"minecraft:block.powder_snow.hit", 1176}, + {"minecraft:block.powder_snow.place", 1177}, + {"minecraft:block.powder_snow.step", 1178}, + {"minecraft:block.pumpkin.carve", 1186}, + {"minecraft:block.redstone_torch.burnout", 1211}, + {"minecraft:block.resin.break", 1344}, + {"minecraft:block.resin.fall", 1345}, + {"minecraft:block.resin.place", 1346}, + {"minecraft:block.resin.step", 1347}, + {"minecraft:block.resin_bricks.break", 1348}, + {"minecraft:block.resin_bricks.fall", 1349}, + {"minecraft:block.resin_bricks.hit", 1350}, + {"minecraft:block.resin_bricks.place", 1351}, + {"minecraft:block.resin_bricks.step", 1352}, + {"minecraft:block.respawn_anchor.ambient", 1212}, + {"minecraft:block.respawn_anchor.charge", 1213}, + {"minecraft:block.respawn_anchor.deplete", 1214}, + {"minecraft:block.respawn_anchor.set_spawn", 1215}, + {"minecraft:block.rooted_dirt.break", 1216}, + {"minecraft:block.rooted_dirt.fall", 1217}, + {"minecraft:block.rooted_dirt.hit", 1218}, + {"minecraft:block.rooted_dirt.place", 1219}, + {"minecraft:block.rooted_dirt.step", 1220}, + {"minecraft:block.roots.break", 595}, + {"minecraft:block.roots.fall", 599}, + {"minecraft:block.roots.hit", 598}, + {"minecraft:block.roots.place", 597}, + {"minecraft:block.roots.step", 596}, + {"minecraft:block.sand.break", 1225}, + {"minecraft:block.sand.fall", 1226}, + {"minecraft:block.sand.hit", 1227}, + {"minecraft:block.sand.idle", 1230}, + {"minecraft:block.sand.place", 1228}, + {"minecraft:block.sand.step", 1229}, + {"minecraft:block.sand.wind", 1231}, + {"minecraft:block.scaffolding.break", 1232}, + {"minecraft:block.scaffolding.fall", 1233}, + {"minecraft:block.scaffolding.hit", 1234}, + {"minecraft:block.scaffolding.place", 1235}, + {"minecraft:block.scaffolding.step", 1236}, + {"minecraft:block.sculk.break", 1239}, + {"minecraft:block.sculk.charge", 1238}, + {"minecraft:block.sculk.fall", 1240}, + {"minecraft:block.sculk.hit", 1241}, + {"minecraft:block.sculk.place", 1242}, + {"minecraft:block.sculk.spread", 1237}, + {"minecraft:block.sculk.step", 1243}, + {"minecraft:block.sculk_catalyst.bloom", 1244}, + {"minecraft:block.sculk_catalyst.break", 1245}, + {"minecraft:block.sculk_catalyst.fall", 1246}, + {"minecraft:block.sculk_catalyst.hit", 1247}, + {"minecraft:block.sculk_catalyst.place", 1248}, + {"minecraft:block.sculk_catalyst.step", 1249}, + {"minecraft:block.sculk_sensor.break", 1252}, + {"minecraft:block.sculk_sensor.clicking", 1250}, + {"minecraft:block.sculk_sensor.clicking_stop", 1251}, + {"minecraft:block.sculk_sensor.fall", 1253}, + {"minecraft:block.sculk_sensor.hit", 1254}, + {"minecraft:block.sculk_sensor.place", 1255}, + {"minecraft:block.sculk_sensor.step", 1256}, + {"minecraft:block.sculk_shrieker.break", 1257}, + {"minecraft:block.sculk_shrieker.fall", 1258}, + {"minecraft:block.sculk_shrieker.hit", 1259}, + {"minecraft:block.sculk_shrieker.place", 1260}, + {"minecraft:block.sculk_shrieker.shriek", 1261}, + {"minecraft:block.sculk_shrieker.step", 1262}, + {"minecraft:block.sculk_vein.break", 1263}, + {"minecraft:block.sculk_vein.fall", 1264}, + {"minecraft:block.sculk_vein.hit", 1265}, + {"minecraft:block.sculk_vein.place", 1266}, + {"minecraft:block.sculk_vein.step", 1267}, + {"minecraft:block.shroomlight.break", 1275}, + {"minecraft:block.shroomlight.fall", 1279}, + {"minecraft:block.shroomlight.hit", 1278}, + {"minecraft:block.shroomlight.place", 1277}, + {"minecraft:block.shroomlight.step", 1276}, + {"minecraft:block.shulker_box.close", 1282}, + {"minecraft:block.shulker_box.open", 1283}, + {"minecraft:block.sign.waxed_interact_fail", 1571}, + {"minecraft:block.slime_block.break", 1316}, + {"minecraft:block.slime_block.fall", 1317}, + {"minecraft:block.slime_block.hit", 1318}, + {"minecraft:block.slime_block.place", 1319}, + {"minecraft:block.slime_block.step", 1320}, + {"minecraft:block.small_amethyst_bud.break", 1321}, + {"minecraft:block.small_amethyst_bud.place", 1322}, + {"minecraft:block.small_dripleaf.break", 1323}, + {"minecraft:block.small_dripleaf.fall", 1324}, + {"minecraft:block.small_dripleaf.hit", 1325}, + {"minecraft:block.small_dripleaf.place", 1326}, + {"minecraft:block.small_dripleaf.step", 1327}, + {"minecraft:block.smithing_table.use", 1371}, + {"minecraft:block.smoker.smoke", 1372}, + {"minecraft:block.sniffer_egg.crack", 1386}, + {"minecraft:block.sniffer_egg.hatch", 1387}, + {"minecraft:block.sniffer_egg.plop", 1385}, + {"minecraft:block.snow.break", 1389}, + {"minecraft:block.snow.fall", 1390}, + {"minecraft:block.snow.hit", 1396}, + {"minecraft:block.snow.place", 1397}, + {"minecraft:block.snow.step", 1398}, + {"minecraft:block.soul_sand.break", 1328}, + {"minecraft:block.soul_sand.fall", 1332}, + {"minecraft:block.soul_sand.hit", 1331}, + {"minecraft:block.soul_sand.place", 1330}, + {"minecraft:block.soul_sand.step", 1329}, + {"minecraft:block.soul_soil.break", 1333}, + {"minecraft:block.soul_soil.fall", 1337}, + {"minecraft:block.soul_soil.hit", 1336}, + {"minecraft:block.soul_soil.place", 1335}, + {"minecraft:block.soul_soil.step", 1334}, + {"minecraft:block.spawner.break", 1339}, + {"minecraft:block.spawner.fall", 1340}, + {"minecraft:block.spawner.hit", 1341}, + {"minecraft:block.spawner.place", 1342}, + {"minecraft:block.spawner.step", 1343}, + {"minecraft:block.sponge.absorb", 1410}, + {"minecraft:block.sponge.break", 1405}, + {"minecraft:block.sponge.fall", 1406}, + {"minecraft:block.sponge.hit", 1407}, + {"minecraft:block.sponge.place", 1408}, + {"minecraft:block.sponge.step", 1409}, + {"minecraft:block.spore_blossom.break", 1353}, + {"minecraft:block.spore_blossom.fall", 1354}, + {"minecraft:block.spore_blossom.hit", 1355}, + {"minecraft:block.spore_blossom.place", 1356}, + {"minecraft:block.spore_blossom.step", 1357}, + {"minecraft:block.stem.break", 984}, + {"minecraft:block.stem.fall", 988}, + {"minecraft:block.stem.hit", 987}, + {"minecraft:block.stem.place", 986}, + {"minecraft:block.stem.step", 985}, + {"minecraft:block.stone.break", 1417}, + {"minecraft:block.stone.fall", 1420}, + {"minecraft:block.stone.hit", 1421}, + {"minecraft:block.stone.place", 1422}, + {"minecraft:block.stone.step", 1425}, + {"minecraft:block.stone_button.click_off", 1418}, + {"minecraft:block.stone_button.click_on", 1419}, + {"minecraft:block.stone_pressure_plate.click_off", 1423}, + {"minecraft:block.stone_pressure_plate.click_on", 1424}, + {"minecraft:block.suspicious_gravel.break", 571}, + {"minecraft:block.suspicious_gravel.fall", 575}, + {"minecraft:block.suspicious_gravel.hit", 574}, + {"minecraft:block.suspicious_gravel.place", 573}, + {"minecraft:block.suspicious_gravel.step", 572}, + {"minecraft:block.suspicious_sand.break", 566}, + {"minecraft:block.suspicious_sand.fall", 570}, + {"minecraft:block.suspicious_sand.hit", 569}, + {"minecraft:block.suspicious_sand.place", 568}, + {"minecraft:block.suspicious_sand.step", 567}, + {"minecraft:block.sweet_berry_bush.break", 1430}, + {"minecraft:block.sweet_berry_bush.pick_berries", 1432}, + {"minecraft:block.sweet_berry_bush.place", 1431}, + {"minecraft:block.trial_spawner.about_to_spawn_item", 707}, + {"minecraft:block.trial_spawner.ambient", 712}, + {"minecraft:block.trial_spawner.ambient_ominous", 713}, + {"minecraft:block.trial_spawner.break", 701}, + {"minecraft:block.trial_spawner.close_shutter", 715}, + {"minecraft:block.trial_spawner.detect_player", 710}, + {"minecraft:block.trial_spawner.eject_item", 716}, + {"minecraft:block.trial_spawner.fall", 705}, + {"minecraft:block.trial_spawner.hit", 704}, + {"minecraft:block.trial_spawner.ominous_activate", 711}, + {"minecraft:block.trial_spawner.open_shutter", 714}, + {"minecraft:block.trial_spawner.place", 703}, + {"minecraft:block.trial_spawner.spawn_item", 708}, + {"minecraft:block.trial_spawner.spawn_item_begin", 709}, + {"minecraft:block.trial_spawner.spawn_mob", 706}, + {"minecraft:block.trial_spawner.step", 702}, + {"minecraft:block.tripwire.attach", 1448}, + {"minecraft:block.tripwire.click_off", 1449}, + {"minecraft:block.tripwire.click_on", 1450}, + {"minecraft:block.tripwire.detach", 1451}, + {"minecraft:block.tuff.break", 1456}, + {"minecraft:block.tuff.fall", 1460}, + {"minecraft:block.tuff.hit", 1459}, + {"minecraft:block.tuff.place", 1458}, + {"minecraft:block.tuff.step", 1457}, + {"minecraft:block.tuff_bricks.break", 1461}, + {"minecraft:block.tuff_bricks.fall", 1462}, + {"minecraft:block.tuff_bricks.hit", 1463}, + {"minecraft:block.tuff_bricks.place", 1464}, + {"minecraft:block.tuff_bricks.step", 1465}, + {"minecraft:block.vault.activate", 1492}, + {"minecraft:block.vault.ambient", 1493}, + {"minecraft:block.vault.break", 1494}, + {"minecraft:block.vault.close_shutter", 1495}, + {"minecraft:block.vault.deactivate", 1496}, + {"minecraft:block.vault.eject_item", 1497}, + {"minecraft:block.vault.fall", 1499}, + {"minecraft:block.vault.hit", 1500}, + {"minecraft:block.vault.insert_item", 1501}, + {"minecraft:block.vault.insert_item_fail", 1502}, + {"minecraft:block.vault.open_shutter", 1503}, + {"minecraft:block.vault.place", 1504}, + {"minecraft:block.vault.reject_rewarded_player", 1498}, + {"minecraft:block.vault.step", 1505}, + {"minecraft:block.vine.break", 1534}, + {"minecraft:block.vine.fall", 1535}, + {"minecraft:block.vine.hit", 1536}, + {"minecraft:block.vine.place", 1537}, + {"minecraft:block.vine.step", 1538}, + {"minecraft:block.wart_block.break", 1009}, + {"minecraft:block.wart_block.fall", 1013}, + {"minecraft:block.wart_block.hit", 1012}, + {"minecraft:block.wart_block.place", 1011}, + {"minecraft:block.wart_block.step", 1010}, + {"minecraft:block.water.ambient", 1572}, + {"minecraft:block.weeping_vines.break", 1004}, + {"minecraft:block.weeping_vines.fall", 1008}, + {"minecraft:block.weeping_vines.hit", 1007}, + {"minecraft:block.weeping_vines.place", 1006}, + {"minecraft:block.weeping_vines.step", 1005}, + {"minecraft:block.wet_grass.break", 1575}, + {"minecraft:block.wet_grass.fall", 1576}, + {"minecraft:block.wet_grass.hit", 1577}, + {"minecraft:block.wet_grass.place", 1578}, + {"minecraft:block.wet_grass.step", 1579}, + {"minecraft:block.wet_sponge.break", 1580}, + {"minecraft:block.wet_sponge.dries", 1581}, + {"minecraft:block.wet_sponge.fall", 1582}, + {"minecraft:block.wet_sponge.hit", 1583}, + {"minecraft:block.wet_sponge.place", 1584}, + {"minecraft:block.wet_sponge.step", 1585}, + {"minecraft:block.wood.break", 1660}, + {"minecraft:block.wood.fall", 1661}, + {"minecraft:block.wood.hit", 1662}, + {"minecraft:block.wood.place", 1663}, + {"minecraft:block.wood.step", 1664}, + {"minecraft:block.wooden_button.click_off", 1656}, + {"minecraft:block.wooden_button.click_on", 1657}, + {"minecraft:block.wooden_door.close", 1652}, + {"minecraft:block.wooden_door.open", 1653}, + {"minecraft:block.wooden_pressure_plate.click_off", 1658}, + {"minecraft:block.wooden_pressure_plate.click_on", 1659}, + {"minecraft:block.wooden_trapdoor.close", 1654}, + {"minecraft:block.wooden_trapdoor.open", 1655}, + {"minecraft:block.wool.break", 1665}, + {"minecraft:block.wool.fall", 1666}, + {"minecraft:block.wool.hit", 1667}, + {"minecraft:block.wool.place", 1668}, + {"minecraft:block.wool.step", 1669}, + {"minecraft:enchant.thorns.hit", 1437}, + {"minecraft:entity.allay.ambient_with_item", 0}, + {"minecraft:entity.allay.ambient_without_item", 1}, + {"minecraft:entity.allay.death", 2}, + {"minecraft:entity.allay.hurt", 3}, + {"minecraft:entity.allay.item_given", 4}, + {"minecraft:entity.allay.item_taken", 5}, + {"minecraft:entity.allay.item_thrown", 6}, + {"minecraft:entity.armadillo.ambient", 57}, + {"minecraft:entity.armadillo.brush", 66}, + {"minecraft:entity.armadillo.death", 59}, + {"minecraft:entity.armadillo.eat", 54}, + {"minecraft:entity.armadillo.hurt", 55}, + {"minecraft:entity.armadillo.hurt_reduced", 56}, + {"minecraft:entity.armadillo.land", 61}, + {"minecraft:entity.armadillo.peek", 64}, + {"minecraft:entity.armadillo.roll", 60}, + {"minecraft:entity.armadillo.scute_drop", 62}, + {"minecraft:entity.armadillo.step", 58}, + {"minecraft:entity.armadillo.unroll_finish", 63}, + {"minecraft:entity.armadillo.unroll_start", 65}, + {"minecraft:entity.armor_stand.break", 78}, + {"minecraft:entity.armor_stand.fall", 79}, + {"minecraft:entity.armor_stand.hit", 80}, + {"minecraft:entity.armor_stand.place", 81}, + {"minecraft:entity.arrow.hit", 82}, + {"minecraft:entity.arrow.hit_player", 83}, + {"minecraft:entity.arrow.shoot", 84}, + {"minecraft:entity.axolotl.attack", 88}, + {"minecraft:entity.axolotl.death", 89}, + {"minecraft:entity.axolotl.hurt", 90}, + {"minecraft:entity.axolotl.idle_air", 91}, + {"minecraft:entity.axolotl.idle_water", 92}, + {"minecraft:entity.axolotl.splash", 93}, + {"minecraft:entity.axolotl.swim", 94}, + {"minecraft:entity.bat.ambient", 135}, + {"minecraft:entity.bat.death", 136}, + {"minecraft:entity.bat.hurt", 137}, + {"minecraft:entity.bat.loop", 138}, + {"minecraft:entity.bat.takeoff", 139}, + {"minecraft:entity.bee.death", 144}, + {"minecraft:entity.bee.hurt", 145}, + {"minecraft:entity.bee.loop", 147}, + {"minecraft:entity.bee.loop_aggressive", 146}, + {"minecraft:entity.bee.pollinate", 149}, + {"minecraft:entity.bee.sting", 148}, + {"minecraft:entity.blaze.ambient", 162}, + {"minecraft:entity.blaze.burn", 163}, + {"minecraft:entity.blaze.death", 164}, + {"minecraft:entity.blaze.hurt", 165}, + {"minecraft:entity.blaze.shoot", 166}, + {"minecraft:entity.boat.paddle_land", 167}, + {"minecraft:entity.boat.paddle_water", 168}, + {"minecraft:entity.bogged.ambient", 169}, + {"minecraft:entity.bogged.death", 170}, + {"minecraft:entity.bogged.hurt", 171}, + {"minecraft:entity.bogged.shear", 172}, + {"minecraft:entity.bogged.step", 173}, + {"minecraft:entity.breeze.charge", 186}, + {"minecraft:entity.breeze.death", 195}, + {"minecraft:entity.breeze.deflect", 187}, + {"minecraft:entity.breeze.hurt", 196}, + {"minecraft:entity.breeze.idle_air", 190}, + {"minecraft:entity.breeze.idle_ground", 189}, + {"minecraft:entity.breeze.inhale", 188}, + {"minecraft:entity.breeze.jump", 192}, + {"minecraft:entity.breeze.land", 193}, + {"minecraft:entity.breeze.shoot", 191}, + {"minecraft:entity.breeze.slide", 194}, + {"minecraft:entity.breeze.whirl", 197}, + {"minecraft:entity.breeze.wind_burst", 198}, + {"minecraft:entity.camel.ambient", 235}, + {"minecraft:entity.camel.dash", 236}, + {"minecraft:entity.camel.dash_ready", 237}, + {"minecraft:entity.camel.death", 238}, + {"minecraft:entity.camel.eat", 239}, + {"minecraft:entity.camel.hurt", 240}, + {"minecraft:entity.camel.saddle", 241}, + {"minecraft:entity.camel.sit", 242}, + {"minecraft:entity.camel.stand", 243}, + {"minecraft:entity.camel.step", 244}, + {"minecraft:entity.camel.step_sand", 245}, + {"minecraft:entity.cat.ambient", 254}, + {"minecraft:entity.cat.beg_for_food", 259}, + {"minecraft:entity.cat.death", 256}, + {"minecraft:entity.cat.eat", 257}, + {"minecraft:entity.cat.hiss", 258}, + {"minecraft:entity.cat.hurt", 260}, + {"minecraft:entity.cat.purr", 261}, + {"minecraft:entity.cat.purreow", 262}, + {"minecraft:entity.cat.stray_ambient", 255}, + {"minecraft:entity.chicken.ambient", 307}, + {"minecraft:entity.chicken.death", 308}, + {"minecraft:entity.chicken.egg", 309}, + {"minecraft:entity.chicken.hurt", 310}, + {"minecraft:entity.chicken.step", 311}, + {"minecraft:entity.cod.ambient", 329}, + {"minecraft:entity.cod.death", 330}, + {"minecraft:entity.cod.flop", 331}, + {"minecraft:entity.cod.hurt", 332}, + {"minecraft:entity.cow.ambient", 369}, + {"minecraft:entity.cow.death", 370}, + {"minecraft:entity.cow.hurt", 371}, + {"minecraft:entity.cow.milk", 372}, + {"minecraft:entity.cow.step", 373}, + {"minecraft:entity.creaking.activate", 377}, + {"minecraft:entity.creaking.ambient", 376}, + {"minecraft:entity.creaking.attack", 379}, + {"minecraft:entity.creaking.deactivate", 378}, + {"minecraft:entity.creaking.death", 380}, + {"minecraft:entity.creaking.freeze", 382}, + {"minecraft:entity.creaking.spawn", 384}, + {"minecraft:entity.creaking.step", 381}, + {"minecraft:entity.creaking.sway", 385}, + {"minecraft:entity.creaking.twitch", 386}, + {"minecraft:entity.creaking.unfreeze", 383}, + {"minecraft:entity.creeper.death", 395}, + {"minecraft:entity.creeper.hurt", 396}, + {"minecraft:entity.creeper.primed", 397}, + {"minecraft:entity.dolphin.ambient", 435}, + {"minecraft:entity.dolphin.ambient_water", 436}, + {"minecraft:entity.dolphin.attack", 437}, + {"minecraft:entity.dolphin.death", 438}, + {"minecraft:entity.dolphin.eat", 439}, + {"minecraft:entity.dolphin.hurt", 440}, + {"minecraft:entity.dolphin.jump", 441}, + {"minecraft:entity.dolphin.play", 442}, + {"minecraft:entity.dolphin.splash", 443}, + {"minecraft:entity.dolphin.swim", 444}, + {"minecraft:entity.donkey.ambient", 445}, + {"minecraft:entity.donkey.angry", 446}, + {"minecraft:entity.donkey.chest", 447}, + {"minecraft:entity.donkey.death", 448}, + {"minecraft:entity.donkey.eat", 449}, + {"minecraft:entity.donkey.hurt", 450}, + {"minecraft:entity.donkey.jump", 451}, + {"minecraft:entity.dragon_fireball.explode", 494}, + {"minecraft:entity.drowned.ambient", 469}, + {"minecraft:entity.drowned.ambient_water", 470}, + {"minecraft:entity.drowned.death", 471}, + {"minecraft:entity.drowned.death_water", 472}, + {"minecraft:entity.drowned.hurt", 473}, + {"minecraft:entity.drowned.hurt_water", 474}, + {"minecraft:entity.drowned.shoot", 475}, + {"minecraft:entity.drowned.step", 476}, + {"minecraft:entity.drowned.swim", 477}, + {"minecraft:entity.egg.throw", 479}, + {"minecraft:entity.elder_guardian.ambient", 480}, + {"minecraft:entity.elder_guardian.ambient_land", 481}, + {"minecraft:entity.elder_guardian.curse", 482}, + {"minecraft:entity.elder_guardian.death", 483}, + {"minecraft:entity.elder_guardian.death_land", 484}, + {"minecraft:entity.elder_guardian.flop", 485}, + {"minecraft:entity.elder_guardian.hurt", 486}, + {"minecraft:entity.elder_guardian.hurt_land", 487}, + {"minecraft:entity.ender_dragon.ambient", 492}, + {"minecraft:entity.ender_dragon.death", 493}, + {"minecraft:entity.ender_dragon.flap", 495}, + {"minecraft:entity.ender_dragon.growl", 496}, + {"minecraft:entity.ender_dragon.hurt", 497}, + {"minecraft:entity.ender_dragon.shoot", 498}, + {"minecraft:entity.ender_eye.death", 499}, + {"minecraft:entity.ender_eye.launch", 500}, + {"minecraft:entity.ender_pearl.throw", 511}, + {"minecraft:entity.enderman.ambient", 501}, + {"minecraft:entity.enderman.death", 502}, + {"minecraft:entity.enderman.hurt", 503}, + {"minecraft:entity.enderman.scream", 504}, + {"minecraft:entity.enderman.stare", 505}, + {"minecraft:entity.enderman.teleport", 506}, + {"minecraft:entity.endermite.ambient", 507}, + {"minecraft:entity.endermite.death", 508}, + {"minecraft:entity.endermite.hurt", 509}, + {"minecraft:entity.endermite.step", 510}, + {"minecraft:entity.evoker.ambient", 515}, + {"minecraft:entity.evoker.cast_spell", 516}, + {"minecraft:entity.evoker.celebrate", 517}, + {"minecraft:entity.evoker.death", 518}, + {"minecraft:entity.evoker.hurt", 520}, + {"minecraft:entity.evoker.prepare_attack", 521}, + {"minecraft:entity.evoker.prepare_summon", 522}, + {"minecraft:entity.evoker.prepare_wololo", 523}, + {"minecraft:entity.evoker_fangs.attack", 519}, + {"minecraft:entity.experience_bottle.throw", 524}, + {"minecraft:entity.experience_orb.pickup", 525}, + {"minecraft:entity.firework_rocket.blast", 535}, + {"minecraft:entity.firework_rocket.blast_far", 536}, + {"minecraft:entity.firework_rocket.large_blast", 537}, + {"minecraft:entity.firework_rocket.large_blast_far", 538}, + {"minecraft:entity.firework_rocket.launch", 539}, + {"minecraft:entity.firework_rocket.shoot", 540}, + {"minecraft:entity.firework_rocket.twinkle", 541}, + {"minecraft:entity.firework_rocket.twinkle_far", 542}, + {"minecraft:entity.fish.swim", 545}, + {"minecraft:entity.fishing_bobber.retrieve", 546}, + {"minecraft:entity.fishing_bobber.splash", 547}, + {"minecraft:entity.fishing_bobber.throw", 548}, + {"minecraft:entity.fox.aggro", 555}, + {"minecraft:entity.fox.ambient", 556}, + {"minecraft:entity.fox.bite", 557}, + {"minecraft:entity.fox.death", 558}, + {"minecraft:entity.fox.eat", 559}, + {"minecraft:entity.fox.hurt", 560}, + {"minecraft:entity.fox.screech", 561}, + {"minecraft:entity.fox.sleep", 562}, + {"minecraft:entity.fox.sniff", 563}, + {"minecraft:entity.fox.spit", 564}, + {"minecraft:entity.fox.teleport", 565}, + {"minecraft:entity.frog.ambient", 587}, + {"minecraft:entity.frog.death", 588}, + {"minecraft:entity.frog.eat", 589}, + {"minecraft:entity.frog.hurt", 590}, + {"minecraft:entity.frog.lay_spawn", 591}, + {"minecraft:entity.frog.long_jump", 592}, + {"minecraft:entity.frog.step", 593}, + {"minecraft:entity.frog.tongue", 594}, + {"minecraft:entity.generic.big_fall", 601}, + {"minecraft:entity.generic.burn", 602}, + {"minecraft:entity.generic.death", 603}, + {"minecraft:entity.generic.drink", 604}, + {"minecraft:entity.generic.eat", 605}, + {"minecraft:entity.generic.explode", 606}, + {"minecraft:entity.generic.extinguish_fire", 607}, + {"minecraft:entity.generic.hurt", 608}, + {"minecraft:entity.generic.small_fall", 609}, + {"minecraft:entity.generic.splash", 610}, + {"minecraft:entity.generic.swim", 611}, + {"minecraft:entity.ghast.ambient", 612}, + {"minecraft:entity.ghast.death", 613}, + {"minecraft:entity.ghast.hurt", 614}, + {"minecraft:entity.ghast.scream", 615}, + {"minecraft:entity.ghast.shoot", 616}, + {"minecraft:entity.ghast.warn", 617}, + {"minecraft:entity.glow_item_frame.add_item", 629}, + {"minecraft:entity.glow_item_frame.break", 630}, + {"minecraft:entity.glow_item_frame.place", 631}, + {"minecraft:entity.glow_item_frame.remove_item", 632}, + {"minecraft:entity.glow_item_frame.rotate_item", 633}, + {"minecraft:entity.glow_squid.ambient", 634}, + {"minecraft:entity.glow_squid.death", 635}, + {"minecraft:entity.glow_squid.hurt", 636}, + {"minecraft:entity.glow_squid.squirt", 637}, + {"minecraft:entity.goat.ambient", 638}, + {"minecraft:entity.goat.death", 639}, + {"minecraft:entity.goat.eat", 640}, + {"minecraft:entity.goat.horn_break", 646}, + {"minecraft:entity.goat.hurt", 641}, + {"minecraft:entity.goat.long_jump", 642}, + {"minecraft:entity.goat.milk", 643}, + {"minecraft:entity.goat.prepare_ram", 644}, + {"minecraft:entity.goat.ram_impact", 645}, + {"minecraft:entity.goat.screaming.ambient", 647}, + {"minecraft:entity.goat.screaming.death", 648}, + {"minecraft:entity.goat.screaming.eat", 649}, + {"minecraft:entity.goat.screaming.hurt", 650}, + {"minecraft:entity.goat.screaming.long_jump", 651}, + {"minecraft:entity.goat.screaming.milk", 652}, + {"minecraft:entity.goat.screaming.prepare_ram", 653}, + {"minecraft:entity.goat.screaming.ram_impact", 654}, + {"minecraft:entity.goat.step", 655}, + {"minecraft:entity.guardian.ambient", 668}, + {"minecraft:entity.guardian.ambient_land", 669}, + {"minecraft:entity.guardian.attack", 670}, + {"minecraft:entity.guardian.death", 671}, + {"minecraft:entity.guardian.death_land", 672}, + {"minecraft:entity.guardian.flop", 673}, + {"minecraft:entity.guardian.hurt", 674}, + {"minecraft:entity.guardian.hurt_land", 675}, + {"minecraft:entity.hoglin.ambient", 718}, + {"minecraft:entity.hoglin.angry", 719}, + {"minecraft:entity.hoglin.attack", 720}, + {"minecraft:entity.hoglin.converted_to_zombified", 721}, + {"minecraft:entity.hoglin.death", 722}, + {"minecraft:entity.hoglin.hurt", 723}, + {"minecraft:entity.hoglin.retreat", 724}, + {"minecraft:entity.hoglin.step", 725}, + {"minecraft:entity.horse.ambient", 742}, + {"minecraft:entity.horse.angry", 743}, + {"minecraft:entity.horse.armor", 744}, + {"minecraft:entity.horse.breathe", 745}, + {"minecraft:entity.horse.death", 746}, + {"minecraft:entity.horse.eat", 747}, + {"minecraft:entity.horse.gallop", 748}, + {"minecraft:entity.horse.hurt", 749}, + {"minecraft:entity.horse.jump", 750}, + {"minecraft:entity.horse.land", 751}, + {"minecraft:entity.horse.saddle", 752}, + {"minecraft:entity.horse.step", 753}, + {"minecraft:entity.horse.step_wood", 754}, + {"minecraft:entity.hostile.big_fall", 755}, + {"minecraft:entity.hostile.death", 756}, + {"minecraft:entity.hostile.hurt", 757}, + {"minecraft:entity.hostile.small_fall", 758}, + {"minecraft:entity.hostile.splash", 759}, + {"minecraft:entity.hostile.swim", 760}, + {"minecraft:entity.husk.ambient", 761}, + {"minecraft:entity.husk.converted_to_zombie", 762}, + {"minecraft:entity.husk.death", 763}, + {"minecraft:entity.husk.hurt", 764}, + {"minecraft:entity.husk.step", 765}, + {"minecraft:entity.illusioner.ambient", 766}, + {"minecraft:entity.illusioner.cast_spell", 767}, + {"minecraft:entity.illusioner.death", 768}, + {"minecraft:entity.illusioner.hurt", 769}, + {"minecraft:entity.illusioner.mirror_move", 770}, + {"minecraft:entity.illusioner.prepare_blindness", 771}, + {"minecraft:entity.illusioner.prepare_mirror", 772}, + {"minecraft:entity.iron_golem.attack", 781}, + {"minecraft:entity.iron_golem.damage", 782}, + {"minecraft:entity.iron_golem.death", 783}, + {"minecraft:entity.iron_golem.hurt", 784}, + {"minecraft:entity.iron_golem.repair", 785}, + {"minecraft:entity.iron_golem.step", 786}, + {"minecraft:entity.item.break", 794}, + {"minecraft:entity.item.pickup", 795}, + {"minecraft:entity.item_frame.add_item", 789}, + {"minecraft:entity.item_frame.break", 790}, + {"minecraft:entity.item_frame.place", 791}, + {"minecraft:entity.item_frame.remove_item", 792}, + {"minecraft:entity.item_frame.rotate_item", 793}, + {"minecraft:entity.leash_knot.break", 816}, + {"minecraft:entity.leash_knot.place", 817}, + {"minecraft:entity.lightning_bolt.impact", 819}, + {"minecraft:entity.lightning_bolt.thunder", 820}, + {"minecraft:entity.lingering_potion.throw", 821}, + {"minecraft:entity.llama.ambient", 822}, + {"minecraft:entity.llama.angry", 823}, + {"minecraft:entity.llama.chest", 824}, + {"minecraft:entity.llama.death", 825}, + {"minecraft:entity.llama.eat", 826}, + {"minecraft:entity.llama.hurt", 827}, + {"minecraft:entity.llama.spit", 828}, + {"minecraft:entity.llama.step", 829}, + {"minecraft:entity.llama.swag", 830}, + {"minecraft:entity.magma_cube.death", 841}, + {"minecraft:entity.magma_cube.death_small", 831}, + {"minecraft:entity.magma_cube.hurt", 842}, + {"minecraft:entity.magma_cube.hurt_small", 843}, + {"minecraft:entity.magma_cube.jump", 844}, + {"minecraft:entity.magma_cube.squish", 845}, + {"minecraft:entity.magma_cube.squish_small", 846}, + {"minecraft:entity.minecart.inside", 862}, + {"minecraft:entity.minecart.inside.underwater", 861}, + {"minecraft:entity.minecart.riding", 863}, + {"minecraft:entity.mooshroom.convert", 864}, + {"minecraft:entity.mooshroom.eat", 865}, + {"minecraft:entity.mooshroom.milk", 866}, + {"minecraft:entity.mooshroom.shear", 868}, + {"minecraft:entity.mooshroom.suspicious_milk", 867}, + {"minecraft:entity.mule.ambient", 899}, + {"minecraft:entity.mule.angry", 900}, + {"minecraft:entity.mule.chest", 901}, + {"minecraft:entity.mule.death", 902}, + {"minecraft:entity.mule.eat", 903}, + {"minecraft:entity.mule.hurt", 904}, + {"minecraft:entity.mule.jump", 905}, + {"minecraft:entity.ocelot.ambient", 1047}, + {"minecraft:entity.ocelot.death", 1048}, + {"minecraft:entity.ocelot.hurt", 1046}, + {"minecraft:entity.painting.break", 1050}, + {"minecraft:entity.painting.place", 1051}, + {"minecraft:entity.panda.aggressive_ambient", 1060}, + {"minecraft:entity.panda.ambient", 1055}, + {"minecraft:entity.panda.bite", 1063}, + {"minecraft:entity.panda.cant_breed", 1059}, + {"minecraft:entity.panda.death", 1056}, + {"minecraft:entity.panda.eat", 1057}, + {"minecraft:entity.panda.hurt", 1062}, + {"minecraft:entity.panda.pre_sneeze", 1053}, + {"minecraft:entity.panda.sneeze", 1054}, + {"minecraft:entity.panda.step", 1058}, + {"minecraft:entity.panda.worried_ambient", 1061}, + {"minecraft:entity.parrot.ambient", 1064}, + {"minecraft:entity.parrot.death", 1065}, + {"minecraft:entity.parrot.eat", 1066}, + {"minecraft:entity.parrot.fly", 1067}, + {"minecraft:entity.parrot.hurt", 1068}, + {"minecraft:entity.parrot.imitate.blaze", 1069}, + {"minecraft:entity.parrot.imitate.bogged", 1070}, + {"minecraft:entity.parrot.imitate.breeze", 1071}, + {"minecraft:entity.parrot.imitate.creaking", 1072}, + {"minecraft:entity.parrot.imitate.creeper", 1073}, + {"minecraft:entity.parrot.imitate.drowned", 1074}, + {"minecraft:entity.parrot.imitate.elder_guardian", 1075}, + {"minecraft:entity.parrot.imitate.ender_dragon", 1076}, + {"minecraft:entity.parrot.imitate.endermite", 1077}, + {"minecraft:entity.parrot.imitate.evoker", 1078}, + {"minecraft:entity.parrot.imitate.ghast", 1079}, + {"minecraft:entity.parrot.imitate.guardian", 1080}, + {"minecraft:entity.parrot.imitate.hoglin", 1081}, + {"minecraft:entity.parrot.imitate.husk", 1082}, + {"minecraft:entity.parrot.imitate.illusioner", 1083}, + {"minecraft:entity.parrot.imitate.magma_cube", 1084}, + {"minecraft:entity.parrot.imitate.phantom", 1085}, + {"minecraft:entity.parrot.imitate.piglin", 1086}, + {"minecraft:entity.parrot.imitate.piglin_brute", 1087}, + {"minecraft:entity.parrot.imitate.pillager", 1088}, + {"minecraft:entity.parrot.imitate.ravager", 1089}, + {"minecraft:entity.parrot.imitate.shulker", 1090}, + {"minecraft:entity.parrot.imitate.silverfish", 1091}, + {"minecraft:entity.parrot.imitate.skeleton", 1092}, + {"minecraft:entity.parrot.imitate.slime", 1093}, + {"minecraft:entity.parrot.imitate.spider", 1094}, + {"minecraft:entity.parrot.imitate.stray", 1095}, + {"minecraft:entity.parrot.imitate.vex", 1096}, + {"minecraft:entity.parrot.imitate.vindicator", 1097}, + {"minecraft:entity.parrot.imitate.warden", 1098}, + {"minecraft:entity.parrot.imitate.witch", 1099}, + {"minecraft:entity.parrot.imitate.wither", 1100}, + {"minecraft:entity.parrot.imitate.wither_skeleton", 1101}, + {"minecraft:entity.parrot.imitate.zoglin", 1102}, + {"minecraft:entity.parrot.imitate.zombie", 1103}, + {"minecraft:entity.parrot.imitate.zombie_villager", 1104}, + {"minecraft:entity.parrot.step", 1105}, + {"minecraft:entity.phantom.ambient", 1106}, + {"minecraft:entity.phantom.bite", 1107}, + {"minecraft:entity.phantom.death", 1108}, + {"minecraft:entity.phantom.flap", 1109}, + {"minecraft:entity.phantom.hurt", 1110}, + {"minecraft:entity.phantom.swoop", 1111}, + {"minecraft:entity.pig.ambient", 1112}, + {"minecraft:entity.pig.death", 1113}, + {"minecraft:entity.pig.hurt", 1114}, + {"minecraft:entity.pig.saddle", 1115}, + {"minecraft:entity.pig.step", 1116}, + {"minecraft:entity.piglin.admiring_item", 1117}, + {"minecraft:entity.piglin.ambient", 1118}, + {"minecraft:entity.piglin.angry", 1119}, + {"minecraft:entity.piglin.celebrate", 1120}, + {"minecraft:entity.piglin.converted_to_zombified", 1126}, + {"minecraft:entity.piglin.death", 1121}, + {"minecraft:entity.piglin.hurt", 1123}, + {"minecraft:entity.piglin.jealous", 1122}, + {"minecraft:entity.piglin.retreat", 1124}, + {"minecraft:entity.piglin.step", 1125}, + {"minecraft:entity.piglin_brute.ambient", 1127}, + {"minecraft:entity.piglin_brute.angry", 1128}, + {"minecraft:entity.piglin_brute.converted_to_zombified", 1132}, + {"minecraft:entity.piglin_brute.death", 1129}, + {"minecraft:entity.piglin_brute.hurt", 1130}, + {"minecraft:entity.piglin_brute.step", 1131}, + {"minecraft:entity.pillager.ambient", 1133}, + {"minecraft:entity.pillager.celebrate", 1134}, + {"minecraft:entity.pillager.death", 1135}, + {"minecraft:entity.pillager.hurt", 1136}, + {"minecraft:entity.player.attack.crit", 1139}, + {"minecraft:entity.player.attack.knockback", 1140}, + {"minecraft:entity.player.attack.nodamage", 1141}, + {"minecraft:entity.player.attack.strong", 1142}, + {"minecraft:entity.player.attack.sweep", 1143}, + {"minecraft:entity.player.attack.weak", 1144}, + {"minecraft:entity.player.big_fall", 1145}, + {"minecraft:entity.player.breath", 1146}, + {"minecraft:entity.player.burp", 1147}, + {"minecraft:entity.player.death", 1148}, + {"minecraft:entity.player.hurt", 1149}, + {"minecraft:entity.player.hurt_drown", 1150}, + {"minecraft:entity.player.hurt_freeze", 1151}, + {"minecraft:entity.player.hurt_on_fire", 1152}, + {"minecraft:entity.player.hurt_sweet_berry_bush", 1153}, + {"minecraft:entity.player.levelup", 1154}, + {"minecraft:entity.player.small_fall", 1155}, + {"minecraft:entity.player.splash", 1156}, + {"minecraft:entity.player.splash.high_speed", 1157}, + {"minecraft:entity.player.swim", 1158}, + {"minecraft:entity.player.teleport", 1159}, + {"minecraft:entity.polar_bear.ambient", 1160}, + {"minecraft:entity.polar_bear.ambient_baby", 1161}, + {"minecraft:entity.polar_bear.death", 1162}, + {"minecraft:entity.polar_bear.hurt", 1163}, + {"minecraft:entity.polar_bear.step", 1164}, + {"minecraft:entity.polar_bear.warning", 1165}, + {"minecraft:entity.puffer_fish.ambient", 1179}, + {"minecraft:entity.puffer_fish.blow_out", 1180}, + {"minecraft:entity.puffer_fish.blow_up", 1181}, + {"minecraft:entity.puffer_fish.death", 1182}, + {"minecraft:entity.puffer_fish.flop", 1183}, + {"minecraft:entity.puffer_fish.hurt", 1184}, + {"minecraft:entity.puffer_fish.sting", 1185}, + {"minecraft:entity.rabbit.ambient", 1187}, + {"minecraft:entity.rabbit.attack", 1188}, + {"minecraft:entity.rabbit.death", 1189}, + {"minecraft:entity.rabbit.hurt", 1190}, + {"minecraft:entity.rabbit.jump", 1191}, + {"minecraft:entity.ravager.ambient", 1193}, + {"minecraft:entity.ravager.attack", 1194}, + {"minecraft:entity.ravager.celebrate", 1195}, + {"minecraft:entity.ravager.death", 1196}, + {"minecraft:entity.ravager.hurt", 1197}, + {"minecraft:entity.ravager.roar", 1200}, + {"minecraft:entity.ravager.step", 1198}, + {"minecraft:entity.ravager.stunned", 1199}, + {"minecraft:entity.salmon.ambient", 1221}, + {"minecraft:entity.salmon.death", 1222}, + {"minecraft:entity.salmon.flop", 1223}, + {"minecraft:entity.salmon.hurt", 1224}, + {"minecraft:entity.sheep.ambient", 1268}, + {"minecraft:entity.sheep.death", 1269}, + {"minecraft:entity.sheep.hurt", 1270}, + {"minecraft:entity.sheep.shear", 1271}, + {"minecraft:entity.sheep.step", 1272}, + {"minecraft:entity.shulker.ambient", 1281}, + {"minecraft:entity.shulker.close", 1286}, + {"minecraft:entity.shulker.death", 1287}, + {"minecraft:entity.shulker.hurt", 1288}, + {"minecraft:entity.shulker.hurt_closed", 1289}, + {"minecraft:entity.shulker.open", 1290}, + {"minecraft:entity.shulker.shoot", 1291}, + {"minecraft:entity.shulker.teleport", 1292}, + {"minecraft:entity.shulker_bullet.hit", 1284}, + {"minecraft:entity.shulker_bullet.hurt", 1285}, + {"minecraft:entity.silverfish.ambient", 1293}, + {"minecraft:entity.silverfish.death", 1294}, + {"minecraft:entity.silverfish.hurt", 1295}, + {"minecraft:entity.silverfish.step", 1296}, + {"minecraft:entity.skeleton.ambient", 1297}, + {"minecraft:entity.skeleton.converted_to_stray", 1298}, + {"minecraft:entity.skeleton.death", 1299}, + {"minecraft:entity.skeleton.hurt", 1308}, + {"minecraft:entity.skeleton.shoot", 1309}, + {"minecraft:entity.skeleton.step", 1310}, + {"minecraft:entity.skeleton_horse.ambient", 1300}, + {"minecraft:entity.skeleton_horse.ambient_water", 1304}, + {"minecraft:entity.skeleton_horse.death", 1301}, + {"minecraft:entity.skeleton_horse.gallop_water", 1305}, + {"minecraft:entity.skeleton_horse.hurt", 1302}, + {"minecraft:entity.skeleton_horse.jump_water", 1306}, + {"minecraft:entity.skeleton_horse.step_water", 1307}, + {"minecraft:entity.skeleton_horse.swim", 1303}, + {"minecraft:entity.slime.attack", 1311}, + {"minecraft:entity.slime.death", 1312}, + {"minecraft:entity.slime.death_small", 1367}, + {"minecraft:entity.slime.hurt", 1313}, + {"minecraft:entity.slime.hurt_small", 1368}, + {"minecraft:entity.slime.jump", 1314}, + {"minecraft:entity.slime.jump_small", 1369}, + {"minecraft:entity.slime.squish", 1315}, + {"minecraft:entity.slime.squish_small", 1370}, + {"minecraft:entity.sniffer.death", 1377}, + {"minecraft:entity.sniffer.digging", 1382}, + {"minecraft:entity.sniffer.digging_stop", 1383}, + {"minecraft:entity.sniffer.drop_seed", 1378}, + {"minecraft:entity.sniffer.eat", 1374}, + {"minecraft:entity.sniffer.happy", 1384}, + {"minecraft:entity.sniffer.hurt", 1376}, + {"minecraft:entity.sniffer.idle", 1375}, + {"minecraft:entity.sniffer.scenting", 1379}, + {"minecraft:entity.sniffer.searching", 1381}, + {"minecraft:entity.sniffer.sniffing", 1380}, + {"minecraft:entity.sniffer.step", 1373}, + {"minecraft:entity.snow_golem.ambient", 1391}, + {"minecraft:entity.snow_golem.death", 1392}, + {"minecraft:entity.snow_golem.hurt", 1393}, + {"minecraft:entity.snow_golem.shear", 1395}, + {"minecraft:entity.snow_golem.shoot", 1394}, + {"minecraft:entity.snowball.throw", 1388}, + {"minecraft:entity.spider.ambient", 1399}, + {"minecraft:entity.spider.death", 1400}, + {"minecraft:entity.spider.hurt", 1401}, + {"minecraft:entity.spider.step", 1402}, + {"minecraft:entity.splash_potion.break", 1403}, + {"minecraft:entity.splash_potion.throw", 1404}, + {"minecraft:entity.squid.ambient", 1413}, + {"minecraft:entity.squid.death", 1414}, + {"minecraft:entity.squid.hurt", 1415}, + {"minecraft:entity.squid.squirt", 1416}, + {"minecraft:entity.stray.ambient", 1426}, + {"minecraft:entity.stray.death", 1427}, + {"minecraft:entity.stray.hurt", 1428}, + {"minecraft:entity.stray.step", 1429}, + {"minecraft:entity.strider.ambient", 1358}, + {"minecraft:entity.strider.death", 1361}, + {"minecraft:entity.strider.eat", 1365}, + {"minecraft:entity.strider.happy", 1359}, + {"minecraft:entity.strider.hurt", 1362}, + {"minecraft:entity.strider.retreat", 1360}, + {"minecraft:entity.strider.saddle", 1366}, + {"minecraft:entity.strider.step", 1363}, + {"minecraft:entity.strider.step_lava", 1364}, + {"minecraft:entity.tadpole.death", 1433}, + {"minecraft:entity.tadpole.flop", 1434}, + {"minecraft:entity.tadpole.grow_up", 1435}, + {"minecraft:entity.tadpole.hurt", 1436}, + {"minecraft:entity.tnt.primed", 1438}, + {"minecraft:entity.tropical_fish.ambient", 1452}, + {"minecraft:entity.tropical_fish.death", 1453}, + {"minecraft:entity.tropical_fish.flop", 1454}, + {"minecraft:entity.tropical_fish.hurt", 1455}, + {"minecraft:entity.turtle.ambient_land", 1471}, + {"minecraft:entity.turtle.death", 1472}, + {"minecraft:entity.turtle.death_baby", 1473}, + {"minecraft:entity.turtle.egg_break", 1474}, + {"minecraft:entity.turtle.egg_crack", 1475}, + {"minecraft:entity.turtle.egg_hatch", 1476}, + {"minecraft:entity.turtle.hurt", 1477}, + {"minecraft:entity.turtle.hurt_baby", 1478}, + {"minecraft:entity.turtle.lay_egg", 1479}, + {"minecraft:entity.turtle.shamble", 1480}, + {"minecraft:entity.turtle.shamble_baby", 1481}, + {"minecraft:entity.turtle.swim", 1482}, + {"minecraft:entity.vex.ambient", 1506}, + {"minecraft:entity.vex.charge", 1507}, + {"minecraft:entity.vex.death", 1508}, + {"minecraft:entity.vex.hurt", 1509}, + {"minecraft:entity.villager.ambient", 1510}, + {"minecraft:entity.villager.celebrate", 1511}, + {"minecraft:entity.villager.death", 1512}, + {"minecraft:entity.villager.hurt", 1513}, + {"minecraft:entity.villager.no", 1514}, + {"minecraft:entity.villager.trade", 1515}, + {"minecraft:entity.villager.work_armorer", 1517}, + {"minecraft:entity.villager.work_butcher", 1518}, + {"minecraft:entity.villager.work_cartographer", 1519}, + {"minecraft:entity.villager.work_cleric", 1520}, + {"minecraft:entity.villager.work_farmer", 1521}, + {"minecraft:entity.villager.work_fisherman", 1522}, + {"minecraft:entity.villager.work_fletcher", 1523}, + {"minecraft:entity.villager.work_leatherworker", 1524}, + {"minecraft:entity.villager.work_librarian", 1525}, + {"minecraft:entity.villager.work_mason", 1526}, + {"minecraft:entity.villager.work_shepherd", 1527}, + {"minecraft:entity.villager.work_toolsmith", 1528}, + {"minecraft:entity.villager.work_weaponsmith", 1529}, + {"minecraft:entity.villager.yes", 1516}, + {"minecraft:entity.vindicator.ambient", 1530}, + {"minecraft:entity.vindicator.celebrate", 1531}, + {"minecraft:entity.vindicator.death", 1532}, + {"minecraft:entity.vindicator.hurt", 1533}, + {"minecraft:entity.wandering_trader.ambient", 1540}, + {"minecraft:entity.wandering_trader.death", 1541}, + {"minecraft:entity.wandering_trader.disappeared", 1542}, + {"minecraft:entity.wandering_trader.drink_milk", 1543}, + {"minecraft:entity.wandering_trader.drink_potion", 1544}, + {"minecraft:entity.wandering_trader.hurt", 1545}, + {"minecraft:entity.wandering_trader.no", 1546}, + {"minecraft:entity.wandering_trader.reappeared", 1547}, + {"minecraft:entity.wandering_trader.trade", 1548}, + {"minecraft:entity.wandering_trader.yes", 1549}, + {"minecraft:entity.warden.agitated", 1550}, + {"minecraft:entity.warden.ambient", 1551}, + {"minecraft:entity.warden.angry", 1552}, + {"minecraft:entity.warden.attack_impact", 1553}, + {"minecraft:entity.warden.death", 1554}, + {"minecraft:entity.warden.dig", 1555}, + {"minecraft:entity.warden.emerge", 1556}, + {"minecraft:entity.warden.heartbeat", 1557}, + {"minecraft:entity.warden.hurt", 1558}, + {"minecraft:entity.warden.listening", 1559}, + {"minecraft:entity.warden.listening_angry", 1560}, + {"minecraft:entity.warden.nearby_close", 1561}, + {"minecraft:entity.warden.nearby_closer", 1562}, + {"minecraft:entity.warden.nearby_closest", 1563}, + {"minecraft:entity.warden.roar", 1564}, + {"minecraft:entity.warden.sniff", 1565}, + {"minecraft:entity.warden.sonic_boom", 1566}, + {"minecraft:entity.warden.sonic_charge", 1567}, + {"minecraft:entity.warden.step", 1568}, + {"minecraft:entity.warden.tendril_clicks", 1569}, + {"minecraft:entity.wind_charge.throw", 1587}, + {"minecraft:entity.wind_charge.wind_burst", 1586}, + {"minecraft:entity.witch.ambient", 1588}, + {"minecraft:entity.witch.celebrate", 1589}, + {"minecraft:entity.witch.death", 1590}, + {"minecraft:entity.witch.drink", 1591}, + {"minecraft:entity.witch.hurt", 1592}, + {"minecraft:entity.witch.throw", 1593}, + {"minecraft:entity.wither.ambient", 1594}, + {"minecraft:entity.wither.break_block", 1595}, + {"minecraft:entity.wither.death", 1596}, + {"minecraft:entity.wither.hurt", 1597}, + {"minecraft:entity.wither.shoot", 1598}, + {"minecraft:entity.wither.spawn", 1603}, + {"minecraft:entity.wither_skeleton.ambient", 1599}, + {"minecraft:entity.wither_skeleton.death", 1600}, + {"minecraft:entity.wither_skeleton.hurt", 1601}, + {"minecraft:entity.wither_skeleton.step", 1602}, + {"minecraft:entity.wolf.ambient", 1610}, + {"minecraft:entity.wolf.death", 1611}, + {"minecraft:entity.wolf.growl", 1612}, + {"minecraft:entity.wolf.hurt", 1613}, + {"minecraft:entity.wolf.pant", 1614}, + {"minecraft:entity.wolf.shake", 1608}, + {"minecraft:entity.wolf.step", 1609}, + {"minecraft:entity.wolf.whine", 1615}, + {"minecraft:entity.wolf_angry.ambient", 1628}, + {"minecraft:entity.wolf_angry.death", 1629}, + {"minecraft:entity.wolf_angry.growl", 1630}, + {"minecraft:entity.wolf_angry.hurt", 1631}, + {"minecraft:entity.wolf_angry.pant", 1632}, + {"minecraft:entity.wolf_angry.whine", 1633}, + {"minecraft:entity.wolf_big.ambient", 1640}, + {"minecraft:entity.wolf_big.death", 1641}, + {"minecraft:entity.wolf_big.growl", 1642}, + {"minecraft:entity.wolf_big.hurt", 1643}, + {"minecraft:entity.wolf_big.pant", 1644}, + {"minecraft:entity.wolf_big.whine", 1645}, + {"minecraft:entity.wolf_cute.ambient", 1646}, + {"minecraft:entity.wolf_cute.death", 1647}, + {"minecraft:entity.wolf_cute.growl", 1648}, + {"minecraft:entity.wolf_cute.hurt", 1649}, + {"minecraft:entity.wolf_cute.pant", 1650}, + {"minecraft:entity.wolf_cute.whine", 1651}, + {"minecraft:entity.wolf_grumpy.ambient", 1634}, + {"minecraft:entity.wolf_grumpy.death", 1635}, + {"minecraft:entity.wolf_grumpy.growl", 1636}, + {"minecraft:entity.wolf_grumpy.hurt", 1637}, + {"minecraft:entity.wolf_grumpy.pant", 1638}, + {"minecraft:entity.wolf_grumpy.whine", 1639}, + {"minecraft:entity.wolf_puglin.ambient", 1616}, + {"minecraft:entity.wolf_puglin.death", 1617}, + {"minecraft:entity.wolf_puglin.growl", 1618}, + {"minecraft:entity.wolf_puglin.hurt", 1619}, + {"minecraft:entity.wolf_puglin.pant", 1620}, + {"minecraft:entity.wolf_puglin.whine", 1621}, + {"minecraft:entity.wolf_sad.ambient", 1622}, + {"minecraft:entity.wolf_sad.death", 1623}, + {"minecraft:entity.wolf_sad.growl", 1624}, + {"minecraft:entity.wolf_sad.hurt", 1625}, + {"minecraft:entity.wolf_sad.pant", 1626}, + {"minecraft:entity.wolf_sad.whine", 1627}, + {"minecraft:entity.zoglin.ambient", 1670}, + {"minecraft:entity.zoglin.angry", 1671}, + {"minecraft:entity.zoglin.attack", 1672}, + {"minecraft:entity.zoglin.death", 1673}, + {"minecraft:entity.zoglin.hurt", 1674}, + {"minecraft:entity.zoglin.step", 1675}, + {"minecraft:entity.zombie.ambient", 1676}, + {"minecraft:entity.zombie.attack_iron_door", 1678}, + {"minecraft:entity.zombie.attack_wooden_door", 1677}, + {"minecraft:entity.zombie.break_wooden_door", 1679}, + {"minecraft:entity.zombie.converted_to_drowned", 1680}, + {"minecraft:entity.zombie.death", 1681}, + {"minecraft:entity.zombie.destroy_egg", 1682}, + {"minecraft:entity.zombie.hurt", 1686}, + {"minecraft:entity.zombie.infect", 1687}, + {"minecraft:entity.zombie.step", 1692}, + {"minecraft:entity.zombie_horse.ambient", 1683}, + {"minecraft:entity.zombie_horse.death", 1684}, + {"minecraft:entity.zombie_horse.hurt", 1685}, + {"minecraft:entity.zombie_villager.ambient", 1693}, + {"minecraft:entity.zombie_villager.converted", 1694}, + {"minecraft:entity.zombie_villager.cure", 1695}, + {"minecraft:entity.zombie_villager.death", 1696}, + {"minecraft:entity.zombie_villager.hurt", 1697}, + {"minecraft:entity.zombie_villager.step", 1698}, + {"minecraft:entity.zombified_piglin.ambient", 1688}, + {"minecraft:entity.zombified_piglin.angry", 1689}, + {"minecraft:entity.zombified_piglin.death", 1690}, + {"minecraft:entity.zombified_piglin.hurt", 1691}, + {"minecraft:event.mob_effect.bad_omen", 1699}, + {"minecraft:event.mob_effect.raid_omen", 1701}, + {"minecraft:event.mob_effect.trial_omen", 1700}, + {"minecraft:event.raid.horn", 1192}, + {"minecraft:intentionally_empty", 978}, + {"minecraft:item.armor.equip_chain", 67}, + {"minecraft:item.armor.equip_diamond", 68}, + {"minecraft:item.armor.equip_elytra", 69}, + {"minecraft:item.armor.equip_generic", 70}, + {"minecraft:item.armor.equip_gold", 71}, + {"minecraft:item.armor.equip_iron", 72}, + {"minecraft:item.armor.equip_leather", 73}, + {"minecraft:item.armor.equip_netherite", 74}, + {"minecraft:item.armor.equip_turtle", 75}, + {"minecraft:item.armor.equip_wolf", 76}, + {"minecraft:item.armor.unequip_wolf", 77}, + {"minecraft:item.axe.scrape", 86}, + {"minecraft:item.axe.strip", 85}, + {"minecraft:item.axe.wax_off", 87}, + {"minecraft:item.bone_meal.use", 179}, + {"minecraft:item.book.page_turn", 180}, + {"minecraft:item.book.put", 181}, + {"minecraft:item.bottle.empty", 183}, + {"minecraft:item.bottle.fill", 184}, + {"minecraft:item.bottle.fill_dragonbreath", 185}, + {"minecraft:item.brush.brushing.generic", 200}, + {"minecraft:item.brush.brushing.gravel", 202}, + {"minecraft:item.brush.brushing.gravel.complete", 204}, + {"minecraft:item.brush.brushing.sand", 201}, + {"minecraft:item.brush.brushing.sand.complete", 203}, + {"minecraft:item.bucket.empty", 211}, + {"minecraft:item.bucket.empty_axolotl", 212}, + {"minecraft:item.bucket.empty_fish", 213}, + {"minecraft:item.bucket.empty_lava", 214}, + {"minecraft:item.bucket.empty_powder_snow", 215}, + {"minecraft:item.bucket.empty_tadpole", 216}, + {"minecraft:item.bucket.fill", 217}, + {"minecraft:item.bucket.fill_axolotl", 218}, + {"minecraft:item.bucket.fill_fish", 219}, + {"minecraft:item.bucket.fill_lava", 220}, + {"minecraft:item.bucket.fill_powder_snow", 221}, + {"minecraft:item.bucket.fill_tadpole", 222}, + {"minecraft:item.bundle.drop_contents", 223}, + {"minecraft:item.bundle.insert", 224}, + {"minecraft:item.bundle.insert_fail", 225}, + {"minecraft:item.bundle.remove_one", 226}, + {"minecraft:item.chorus_fruit.teleport", 323}, + {"minecraft:item.crop.plant", 399}, + {"minecraft:item.crossbow.hit", 400}, + {"minecraft:item.crossbow.loading_end", 401}, + {"minecraft:item.crossbow.loading_middle", 402}, + {"minecraft:item.crossbow.loading_start", 403}, + {"minecraft:item.crossbow.quick_charge_1", 404}, + {"minecraft:item.crossbow.quick_charge_2", 405}, + {"minecraft:item.crossbow.quick_charge_3", 406}, + {"minecraft:item.crossbow.shoot", 407}, + {"minecraft:item.dye.use", 478}, + {"minecraft:item.elytra.flying", 488}, + {"minecraft:item.firecharge.use", 533}, + {"minecraft:item.flintandsteel.use", 549}, + {"minecraft:item.glow_ink_sac.use", 628}, + {"minecraft:item.goat_horn.sound.0", 734}, + {"minecraft:item.goat_horn.sound.1", 735}, + {"minecraft:item.goat_horn.sound.2", 736}, + {"minecraft:item.goat_horn.sound.3", 737}, + {"minecraft:item.goat_horn.sound.4", 738}, + {"minecraft:item.goat_horn.sound.5", 739}, + {"minecraft:item.goat_horn.sound.6", 740}, + {"minecraft:item.goat_horn.sound.7", 741}, + {"minecraft:item.hoe.till", 717}, + {"minecraft:item.honey_bottle.drink", 733}, + {"minecraft:item.honeycomb.wax_on", 732}, + {"minecraft:item.ink_sac.use", 773}, + {"minecraft:item.lodestone_compass.lock", 837}, + {"minecraft:item.mace.smash_air", 838}, + {"minecraft:item.mace.smash_ground", 839}, + {"minecraft:item.mace.smash_ground_heavy", 840}, + {"minecraft:item.nether_wart.plant", 962}, + {"minecraft:item.ominous_bottle.dispose", 1049}, + {"minecraft:item.shield.block", 1273}, + {"minecraft:item.shield.break", 1274}, + {"minecraft:item.shovel.flatten", 1280}, + {"minecraft:item.spyglass.stop_using", 1412}, + {"minecraft:item.spyglass.use", 1411}, + {"minecraft:item.totem.use", 1439}, + {"minecraft:item.trident.hit", 1440}, + {"minecraft:item.trident.hit_ground", 1441}, + {"minecraft:item.trident.return", 1442}, + {"minecraft:item.trident.riptide_1", 1443}, + {"minecraft:item.trident.riptide_2", 1444}, + {"minecraft:item.trident.riptide_3", 1445}, + {"minecraft:item.trident.throw", 1446}, + {"minecraft:item.trident.thunder", 1447}, + {"minecraft:item.wolf_armor.break", 1604}, + {"minecraft:item.wolf_armor.crack", 1605}, + {"minecraft:item.wolf_armor.damage", 1606}, + {"minecraft:item.wolf_armor.repair", 1607}, + {"minecraft:music.creative", 906}, + {"minecraft:music.credits", 907}, + {"minecraft:music.dragon", 927}, + {"minecraft:music.end", 928}, + {"minecraft:music.game", 929}, + {"minecraft:music.menu", 930}, + {"minecraft:music.nether.basalt_deltas", 931}, + {"minecraft:music.nether.crimson_forest", 932}, + {"minecraft:music.nether.nether_wastes", 943}, + {"minecraft:music.nether.soul_sand_valley", 946}, + {"minecraft:music.nether.warped_forest", 948}, + {"minecraft:music.overworld.badlands", 951}, + {"minecraft:music.overworld.bamboo_jungle", 954}, + {"minecraft:music.overworld.cherry_grove", 942}, + {"minecraft:music.overworld.deep_dark", 933}, + {"minecraft:music.overworld.desert", 950}, + {"minecraft:music.overworld.dripstone_caves", 934}, + {"minecraft:music.overworld.flower_forest", 949}, + {"minecraft:music.overworld.forest", 939}, + {"minecraft:music.overworld.frozen_peaks", 944}, + {"minecraft:music.overworld.grove", 935}, + {"minecraft:music.overworld.jagged_peaks", 936}, + {"minecraft:music.overworld.jungle", 952}, + {"minecraft:music.overworld.lush_caves", 937}, + {"minecraft:music.overworld.meadow", 941}, + {"minecraft:music.overworld.old_growth_taiga", 940}, + {"minecraft:music.overworld.snowy_slopes", 945}, + {"minecraft:music.overworld.sparse_jungle", 953}, + {"minecraft:music.overworld.stony_peaks", 947}, + {"minecraft:music.overworld.swamp", 938}, + {"minecraft:music.under_water", 955}, + {"minecraft:music_disc.11", 909}, + {"minecraft:music_disc.13", 910}, + {"minecraft:music_disc.5", 908}, + {"minecraft:music_disc.blocks", 911}, + {"minecraft:music_disc.cat", 912}, + {"minecraft:music_disc.chirp", 913}, + {"minecraft:music_disc.creator", 924}, + {"minecraft:music_disc.creator_music_box", 925}, + {"minecraft:music_disc.far", 914}, + {"minecraft:music_disc.mall", 915}, + {"minecraft:music_disc.mellohi", 916}, + {"minecraft:music_disc.otherside", 922}, + {"minecraft:music_disc.pigstep", 917}, + {"minecraft:music_disc.precipice", 926}, + {"minecraft:music_disc.relic", 923}, + {"minecraft:music_disc.stal", 918}, + {"minecraft:music_disc.strad", 919}, + {"minecraft:music_disc.wait", 920}, + {"minecraft:music_disc.ward", 921}, + {"minecraft:particle.soul_escape", 1338}, + {"minecraft:ui.button.click", 1483}, + {"minecraft:ui.cartography_table.take_result", 1486}, + {"minecraft:ui.hud.bubble_pop", 210}, + {"minecraft:ui.loom.select_pattern", 1484}, + {"minecraft:ui.loom.take_result", 1485}, + {"minecraft:ui.stonecutter.select_recipe", 1488}, + {"minecraft:ui.stonecutter.take_result", 1487}, + {"minecraft:ui.toast.challenge_complete", 1489}, + {"minecraft:ui.toast.in", 1490}, + {"minecraft:ui.toast.out", 1491}, + {"minecraft:weather.rain", 1573}, + {"minecraft:weather.rain.above", 1574}, + }; + return registry; + } + + static std::map getSpawnConditionType() { + static std::map registry = { + {"minecraft:biome", 2}, + {"minecraft:moon_brightness", 1}, + {"minecraft:structure", 0}, + }; + return registry; + } + + static std::map getStatType() { + static std::map registry = { + {"minecraft:broken", 3}, + {"minecraft:crafted", 1}, + {"minecraft:custom", 8}, + {"minecraft:dropped", 5}, + {"minecraft:killed", 6}, + {"minecraft:killed_by", 7}, + {"minecraft:mined", 0}, + {"minecraft:picked_up", 4}, + {"minecraft:used", 2}, + }; + return registry; + } + + static std::map getTestEnvironmentDefinitionType() { + static std::map registry = { + {"minecraft:all_of", 0}, + {"minecraft:function", 4}, + {"minecraft:game_rules", 1}, + {"minecraft:time_of_day", 2}, + {"minecraft:weather", 3}, + }; + return registry; + } + + static std::map getTestFunction() { + static std::map registry = { + {"minecraft:always_pass", 0}, + }; + return registry; + } + + static std::map getTestInstanceType() { + static std::map registry = { + {"minecraft:block_based", 0}, + {"minecraft:function", 1}, + }; + return registry; + } + + static std::map getTicketType() { + static std::map registry = { + {"minecraft:dragon", 1}, + {"minecraft:ender_pearl", 6}, + {"minecraft:forced", 4}, + {"minecraft:player_loading", 2}, + {"minecraft:player_simulation", 3}, + {"minecraft:portal", 5}, + {"minecraft:start", 0}, + {"minecraft:unknown", 7}, + }; + return registry; + } + + static std::map getTriggerType() { + static std::map registry = { + {"minecraft:allay_drop_item_on_block", 51}, + {"minecraft:any_block_use", 40}, + {"minecraft:avoid_vibration", 52}, + {"minecraft:bee_nest_destroyed", 36}, + {"minecraft:bred_animals", 14}, + {"minecraft:brewed_potion", 10}, + {"minecraft:changed_dimension", 21}, + {"minecraft:channeled_lightning", 30}, + {"minecraft:construct_beacon", 11}, + {"minecraft:consume_item", 25}, + {"minecraft:crafter_recipe_crafted", 54}, + {"minecraft:cured_zombie_villager", 17}, + {"minecraft:default_block_use", 39}, + {"minecraft:effects_changed", 26}, + {"minecraft:enchanted_item", 8}, + {"minecraft:enter_block", 3}, + {"minecraft:entity_hurt_player", 7}, + {"minecraft:entity_killed_player", 2}, + {"minecraft:fall_after_explosion", 55}, + {"minecraft:fall_from_height", 48}, + {"minecraft:filled_bucket", 9}, + {"minecraft:fishing_rod_hooked", 29}, + {"minecraft:hero_of_the_village", 33}, + {"minecraft:impossible", 0}, + {"minecraft:inventory_changed", 4}, + {"minecraft:item_durability_changed", 19}, + {"minecraft:item_used_on_block", 38}, + {"minecraft:kill_mob_near_sculk_catalyst", 50}, + {"minecraft:killed_by_arrow", 32}, + {"minecraft:levitation", 20}, + {"minecraft:lightning_strike", 46}, + {"minecraft:location", 15}, + {"minecraft:nether_travel", 28}, + {"minecraft:placed_block", 24}, + {"minecraft:player_generates_container_loot", 41}, + {"minecraft:player_hurt_entity", 6}, + {"minecraft:player_interacted_with_entity", 44}, + {"minecraft:player_killed_entity", 1}, + {"minecraft:recipe_crafted", 53}, + {"minecraft:recipe_unlocked", 5}, + {"minecraft:ride_entity_in_lava", 49}, + {"minecraft:shot_crossbow", 31}, + {"minecraft:slept_in_bed", 16}, + {"minecraft:slide_down_block", 35}, + {"minecraft:started_riding", 45}, + {"minecraft:summoned_entity", 13}, + {"minecraft:tame_animal", 23}, + {"minecraft:target_hit", 37}, + {"minecraft:thrown_item_picked_up_by_entity", 42}, + {"minecraft:thrown_item_picked_up_by_player", 43}, + {"minecraft:tick", 22}, + {"minecraft:used_ender_eye", 12}, + {"minecraft:used_totem", 27}, + {"minecraft:using_item", 47}, + {"minecraft:villager_trade", 18}, + {"minecraft:voluntary_exile", 34}, + }; + return registry; + } + + static std::map getVillagerProfession() { + static std::map registry = { + {"minecraft:armorer", 1}, + {"minecraft:butcher", 2}, + {"minecraft:cartographer", 3}, + {"minecraft:cleric", 4}, + {"minecraft:farmer", 5}, + {"minecraft:fisherman", 6}, + {"minecraft:fletcher", 7}, + {"minecraft:leatherworker", 8}, + {"minecraft:librarian", 9}, + {"minecraft:mason", 10}, + {"minecraft:nitwit", 11}, + {"minecraft:none", 0}, + {"minecraft:shepherd", 12}, + {"minecraft:toolsmith", 13}, + {"minecraft:weaponsmith", 14}, + }; + return registry; + } + + static std::map getVillagerType() { + static std::map registry = { + {"minecraft:desert", 0}, + {"minecraft:jungle", 1}, + {"minecraft:plains", 2}, + {"minecraft:savanna", 3}, + {"minecraft:snow", 4}, + {"minecraft:swamp", 5}, + {"minecraft:taiga", 6}, + }; + return registry; + } + + static std::map getWorldgenBiomeSource() { + static std::map registry = { + {"minecraft:checkerboard", 2}, + {"minecraft:fixed", 0}, + {"minecraft:multi_noise", 1}, + {"minecraft:the_end", 3}, + }; + return registry; + } + + static std::map getWorldgenBlockStateProviderType() { + static std::map registry = { + {"minecraft:dual_noise_provider", 4}, + {"minecraft:noise_provider", 3}, + {"minecraft:noise_threshold_provider", 2}, + {"minecraft:randomized_int_state_provider", 6}, + {"minecraft:rotated_block_provider", 5}, + {"minecraft:simple_state_provider", 0}, + {"minecraft:weighted_state_provider", 1}, + }; + return registry; + } + + static std::map getWorldgenCarver() { + static std::map registry = { + {"minecraft:canyon", 2}, + {"minecraft:cave", 0}, + {"minecraft:nether_cave", 1}, + }; + return registry; + } + + static std::map getWorldgenChunkGenerator() { + static std::map registry = { + {"minecraft:debug", 2}, + {"minecraft:flat", 1}, + {"minecraft:noise", 0}, + }; + return registry; + } + + static std::map getWorldgenDensityFunctionType() { + static std::map registry = { + {"minecraft:abs", 19}, + {"minecraft:add", 25}, + {"minecraft:beardifier", 2}, + {"minecraft:blend_alpha", 0}, + {"minecraft:blend_density", 17}, + {"minecraft:blend_offset", 1}, + {"minecraft:cache_2d", 6}, + {"minecraft:cache_all_in_cell", 8}, + {"minecraft:cache_once", 7}, + {"minecraft:clamp", 18}, + {"minecraft:constant", 30}, + {"minecraft:cube", 21}, + {"minecraft:end_islands", 10}, + {"minecraft:flat_cache", 5}, + {"minecraft:half_negative", 22}, + {"minecraft:interpolated", 4}, + {"minecraft:max", 28}, + {"minecraft:min", 27}, + {"minecraft:mul", 26}, + {"minecraft:noise", 9}, + {"minecraft:old_blended_noise", 3}, + {"minecraft:quarter_negative", 23}, + {"minecraft:range_choice", 13}, + {"minecraft:shift", 16}, + {"minecraft:shift_a", 14}, + {"minecraft:shift_b", 15}, + {"minecraft:shifted_noise", 12}, + {"minecraft:spline", 29}, + {"minecraft:square", 20}, + {"minecraft:squeeze", 24}, + {"minecraft:weird_scaled_sampler", 11}, + {"minecraft:y_clamped_gradient", 31}, + }; + return registry; + } + + static std::map getWorldgenFeature() { + static std::map registry = { + {"minecraft:bamboo", 43}, + {"minecraft:basalt_columns", 48}, + {"minecraft:basalt_pillar", 53}, + {"minecraft:block_column", 19}, + {"minecraft:block_pile", 6}, + {"minecraft:blue_ice", 26}, + {"minecraft:bonus_chest", 52}, + {"minecraft:chorus_plant", 8}, + {"minecraft:coral_claw", 40}, + {"minecraft:coral_mushroom", 39}, + {"minecraft:coral_tree", 38}, + {"minecraft:delta_feature", 49}, + {"minecraft:desert_well", 11}, + {"minecraft:disk", 29}, + {"minecraft:dripstone_cluster", 59}, + {"minecraft:end_gateway", 35}, + {"minecraft:end_island", 34}, + {"minecraft:end_platform", 32}, + {"minecraft:end_spike", 33}, + {"minecraft:fallen_tree", 2}, + {"minecraft:fill_layer", 51}, + {"minecraft:flower", 3}, + {"minecraft:forest_rock", 28}, + {"minecraft:fossil", 12}, + {"minecraft:freeze_top_layer", 17}, + {"minecraft:geode", 58}, + {"minecraft:glowstone_blob", 16}, + {"minecraft:huge_brown_mushroom", 14}, + {"minecraft:huge_fungus", 44}, + {"minecraft:huge_red_mushroom", 13}, + {"minecraft:ice_spike", 15}, + {"minecraft:iceberg", 27}, + {"minecraft:kelp", 37}, + {"minecraft:lake", 30}, + {"minecraft:large_dripstone", 60}, + {"minecraft:monster_room", 25}, + {"minecraft:multiface_growth", 23}, + {"minecraft:nether_forest_vegetation", 45}, + {"minecraft:netherrack_replace_blobs", 50}, + {"minecraft:no_bonemeal_flower", 4}, + {"minecraft:no_op", 0}, + {"minecraft:ore", 31}, + {"minecraft:pointed_dripstone", 61}, + {"minecraft:random_boolean_selector", 57}, + {"minecraft:random_patch", 5}, + {"minecraft:random_selector", 55}, + {"minecraft:replace_single_block", 9}, + {"minecraft:root_system", 22}, + {"minecraft:scattered_ore", 54}, + {"minecraft:sculk_patch", 62}, + {"minecraft:sea_pickle", 41}, + {"minecraft:seagrass", 36}, + {"minecraft:simple_block", 42}, + {"minecraft:simple_random_selector", 56}, + {"minecraft:spring_feature", 7}, + {"minecraft:tree", 1}, + {"minecraft:twisting_vines", 47}, + {"minecraft:underwater_magma", 24}, + {"minecraft:vegetation_patch", 20}, + {"minecraft:vines", 18}, + {"minecraft:void_start_platform", 10}, + {"minecraft:waterlogged_vegetation_patch", 21}, + {"minecraft:weeping_vines", 46}, + }; + return registry; + } + + static std::map getWorldgenFeatureSizeType() { + static std::map registry = { + {"minecraft:three_layers_feature_size", 1}, + {"minecraft:two_layers_feature_size", 0}, + }; + return registry; + } + + static std::map getWorldgenFoliagePlacerType() { + static std::map registry = { + {"minecraft:acacia_foliage_placer", 3}, + {"minecraft:blob_foliage_placer", 0}, + {"minecraft:bush_foliage_placer", 4}, + {"minecraft:cherry_foliage_placer", 10}, + {"minecraft:dark_oak_foliage_placer", 8}, + {"minecraft:fancy_foliage_placer", 5}, + {"minecraft:jungle_foliage_placer", 6}, + {"minecraft:mega_pine_foliage_placer", 7}, + {"minecraft:pine_foliage_placer", 2}, + {"minecraft:random_spread_foliage_placer", 9}, + {"minecraft:spruce_foliage_placer", 1}, + }; + return registry; + } + + static std::map getWorldgenMaterialCondition() { + static std::map registry = { + {"minecraft:above_preliminary_surface", 9}, + {"minecraft:biome", 0}, + {"minecraft:hole", 8}, + {"minecraft:noise_threshold", 1}, + {"minecraft:not", 7}, + {"minecraft:steep", 6}, + {"minecraft:stone_depth", 10}, + {"minecraft:temperature", 5}, + {"minecraft:vertical_gradient", 2}, + {"minecraft:water", 4}, + {"minecraft:y_above", 3}, + }; + return registry; + } + + static std::map getWorldgenMaterialRule() { + static std::map registry = { + {"minecraft:bandlands", 0}, + {"minecraft:block", 1}, + {"minecraft:condition", 3}, + {"minecraft:sequence", 2}, + }; + return registry; + } + + static std::map getWorldgenPlacementModifierType() { + static std::map registry = { + {"minecraft:biome", 4}, + {"minecraft:block_predicate_filter", 0}, + {"minecraft:count", 5}, + {"minecraft:count_on_every_layer", 8}, + {"minecraft:environment_scan", 9}, + {"minecraft:fixed_placement", 14}, + {"minecraft:height_range", 11}, + {"minecraft:heightmap", 10}, + {"minecraft:in_square", 12}, + {"minecraft:noise_based_count", 6}, + {"minecraft:noise_threshold_count", 7}, + {"minecraft:random_offset", 13}, + {"minecraft:rarity_filter", 1}, + {"minecraft:surface_relative_threshold_filter", 2}, + {"minecraft:surface_water_depth_filter", 3}, + }; + return registry; + } + + static std::map getWorldgenPoolAliasBinding() { + static std::map registry = { + {"minecraft:direct", 2}, + {"minecraft:random", 0}, + {"minecraft:random_group", 1}, + }; + return registry; + } + + static std::map getWorldgenRootPlacerType() { + static std::map registry = { + {"minecraft:mangrove_root_placer", 0}, + }; + return registry; + } + + static std::map getWorldgenStructurePiece() { + static std::map registry = { + {"minecraft:btp", 52}, {"minecraft:ecp", 50}, {"minecraft:iglu", 34}, {"minecraft:jigsaw", 55}, + {"minecraft:mscorridor", 0}, {"minecraft:mscrossing", 1}, {"minecraft:msroom", 2}, {"minecraft:msstairs", 3}, + {"minecraft:nebcr", 4}, {"minecraft:nebef", 5}, {"minecraft:nebs", 6}, {"minecraft:neccs", 7}, + {"minecraft:nece", 9}, {"minecraft:necsr", 14}, {"minecraft:nectb", 8}, {"minecraft:nefos", 54}, + {"minecraft:nemt", 15}, {"minecraft:nerc", 16}, {"minecraft:nesc", 12}, {"minecraft:nesclt", 11}, + {"minecraft:nescrt", 13}, {"minecraft:nescsc", 10}, {"minecraft:nesr", 17}, {"minecraft:nestart", 18}, + {"minecraft:omb", 38}, {"minecraft:omcr", 39}, {"minecraft:omdxr", 40}, {"minecraft:omdxyr", 41}, + {"minecraft:omdyr", 42}, {"minecraft:omdyzr", 43}, {"minecraft:omdzr", 44}, {"minecraft:omentry", 45}, + {"minecraft:ompenthouse", 46}, {"minecraft:omsimple", 47}, {"minecraft:omsimplet", 48}, {"minecraft:omwr", 49}, + {"minecraft:orp", 33}, {"minecraft:rupo", 35}, {"minecraft:sh5c", 21}, {"minecraft:shcc", 19}, + {"minecraft:shfc", 20}, {"minecraft:shipwreck", 53}, {"minecraft:shli", 23}, {"minecraft:shlt", 22}, + {"minecraft:shph", 25}, {"minecraft:shpr", 24}, {"minecraft:shrc", 27}, {"minecraft:shrt", 26}, + {"minecraft:shs", 30}, {"minecraft:shsd", 28}, {"minecraft:shssd", 31}, {"minecraft:shstart", 29}, + {"minecraft:tedp", 37}, {"minecraft:tejp", 32}, {"minecraft:tesh", 36}, {"minecraft:wmp", 51}, + }; + return registry; + } + + static std::map getWorldgenStructurePlacement() { + static std::map registry = { + {"minecraft:concentric_rings", 1}, + {"minecraft:random_spread", 0}, + }; + return registry; + } + + static std::map getWorldgenStructurePoolElement() { + static std::map registry = { + {"minecraft:empty_pool_element", 3}, + {"minecraft:feature_pool_element", 2}, + {"minecraft:legacy_single_pool_element", 4}, + {"minecraft:list_pool_element", 1}, + {"minecraft:single_pool_element", 0}, + }; + return registry; + } + + static std::map getWorldgenStructureProcessor() { + static std::map registry = { + {"minecraft:blackstone_replace", 7}, + {"minecraft:block_age", 6}, + {"minecraft:block_ignore", 0}, + {"minecraft:block_rot", 1}, + {"minecraft:capped", 10}, + {"minecraft:gravity", 2}, + {"minecraft:jigsaw_replacement", 3}, + {"minecraft:lava_submerged_block", 8}, + {"minecraft:nop", 5}, + {"minecraft:protected_blocks", 9}, + {"minecraft:rule", 4}, + }; + return registry; + } + + static std::map getWorldgenStructureType() { + static std::map registry = { + {"minecraft:buried_treasure", 0}, + {"minecraft:desert_pyramid", 1}, + {"minecraft:end_city", 2}, + {"minecraft:fortress", 3}, + {"minecraft:igloo", 4}, + {"minecraft:jigsaw", 5}, + {"minecraft:jungle_temple", 6}, + {"minecraft:mineshaft", 7}, + {"minecraft:nether_fossil", 8}, + {"minecraft:ocean_monument", 9}, + {"minecraft:ocean_ruin", 10}, + {"minecraft:ruined_portal", 11}, + {"minecraft:shipwreck", 12}, + {"minecraft:stronghold", 13}, + {"minecraft:swamp_hut", 14}, + {"minecraft:woodland_mansion", 15}, + }; + return registry; + } + + static std::map getWorldgenTreeDecoratorType() { + static std::map registry = { + {"minecraft:alter_ground", 6}, + {"minecraft:attached_to_leaves", 7}, + {"minecraft:attached_to_logs", 9}, + {"minecraft:beehive", 5}, + {"minecraft:cocoa", 4}, + {"minecraft:creaking_heart", 3}, + {"minecraft:leave_vine", 1}, + {"minecraft:pale_moss", 2}, + {"minecraft:place_on_ground", 8}, + {"minecraft:trunk_vine", 0}, + }; + return registry; + } + + static std::map getWorldgenTrunkPlacerType() { + static std::map registry = { + {"minecraft:bending_trunk_placer", 6}, + {"minecraft:cherry_trunk_placer", 8}, + {"minecraft:dark_oak_trunk_placer", 4}, + {"minecraft:fancy_trunk_placer", 5}, + {"minecraft:forking_trunk_placer", 1}, + {"minecraft:giant_trunk_placer", 2}, + {"minecraft:mega_jungle_trunk_placer", 3}, + {"minecraft:straight_trunk_placer", 0}, + {"minecraft:upwards_branching_trunk_placer", 7}, + }; + return registry; + } + + static uint32_t getRegistryId(const std::string& registryType, const std::string& entryName) { + static std::map> allRegistries = { + {"minecraft:activity", + { + {"minecraft:admire_item", 12}, {"minecraft:avoid", 13}, {"minecraft:celebrate", 11}, {"minecraft:core", 0}, + {"minecraft:dig", 25}, {"minecraft:emerge", 24}, {"minecraft:fight", 10}, {"minecraft:hide", 9}, + {"minecraft:idle", 1}, {"minecraft:investigate", 22}, {"minecraft:lay_spawn", 20}, {"minecraft:long_jump", 16}, + {"minecraft:meet", 5}, {"minecraft:panic", 6}, {"minecraft:play", 3}, {"minecraft:play_dead", 15}, + {"minecraft:pre_raid", 8}, {"minecraft:raid", 7}, {"minecraft:ram", 17}, {"minecraft:rest", 4}, + {"minecraft:ride", 14}, {"minecraft:roar", 23}, {"minecraft:sniff", 21}, {"minecraft:swim", 19}, + {"minecraft:tongue", 18}, {"minecraft:work", 2}, + }}, + {"minecraft:attribute", + { + {"minecraft:armor", 0}, + {"minecraft:armor_toughness", 1}, + {"minecraft:attack_damage", 2}, + {"minecraft:attack_knockback", 3}, + {"minecraft:attack_speed", 4}, + {"minecraft:block_break_speed", 5}, + {"minecraft:block_interaction_range", 6}, + {"minecraft:burning_time", 7}, + {"minecraft:entity_interaction_range", 9}, + {"minecraft:explosion_knockback_resistance", 8}, + {"minecraft:fall_damage_multiplier", 10}, + {"minecraft:flying_speed", 11}, + {"minecraft:follow_range", 12}, + {"minecraft:gravity", 13}, + {"minecraft:jump_strength", 14}, + {"minecraft:knockback_resistance", 15}, + {"minecraft:luck", 16}, + {"minecraft:max_absorption", 17}, + {"minecraft:max_health", 18}, + {"minecraft:mining_efficiency", 19}, + {"minecraft:movement_efficiency", 20}, + {"minecraft:movement_speed", 21}, + {"minecraft:oxygen_bonus", 22}, + {"minecraft:safe_fall_distance", 23}, + {"minecraft:scale", 24}, + {"minecraft:sneaking_speed", 25}, + {"minecraft:spawn_reinforcements", 26}, + {"minecraft:step_height", 27}, + {"minecraft:submerged_mining_speed", 28}, + {"minecraft:sweeping_damage_ratio", 29}, + {"minecraft:tempt_range", 30}, + {"minecraft:water_movement_efficiency", 31}, + }}, + {"minecraft:block", + { + {"minecraft:acacia_button", 415}, + {"minecraft:acacia_door", 617}, + {"minecraft:acacia_fence", 608}, + {"minecraft:acacia_fence_gate", 599}, + {"minecraft:acacia_hanging_sign", 224}, + {"minecraft:acacia_leaves", 92}, + {"minecraft:acacia_log", 53}, + {"minecraft:acacia_planks", 17}, + {"minecraft:acacia_pressure_plate", 252}, + {"minecraft:acacia_sapling", 29}, + {"minecraft:acacia_sign", 200}, + {"minecraft:acacia_slab", 571}, + {"minecraft:acacia_stairs", 484}, + {"minecraft:acacia_trapdoor", 305}, + {"minecraft:acacia_wall_hanging_sign", 236}, + {"minecraft:acacia_wall_sign", 214}, + {"minecraft:acacia_wood", 75}, + {"minecraft:activator_rail", 450}, + {"minecraft:air", 0}, + {"minecraft:allium", 161}, + {"minecraft:amethyst_block", 937}, + {"minecraft:amethyst_cluster", 939}, + {"minecraft:ancient_debris", 875}, + {"minecraft:andesite", 6}, + {"minecraft:andesite_slab", 787}, + {"minecraft:andesite_stairs", 774}, + {"minecraft:andesite_wall", 799}, + {"minecraft:anvil", 435}, + {"minecraft:attached_melon_stem", 332}, + {"minecraft:attached_pumpkin_stem", 331}, + {"minecraft:azalea", 1046}, + {"minecraft:azalea_leaves", 97}, + {"minecraft:azure_bluet", 162}, + {"minecraft:bamboo", 759}, + {"minecraft:bamboo_block", 60}, + {"minecraft:bamboo_button", 420}, + {"minecraft:bamboo_door", 622}, + {"minecraft:bamboo_fence", 613}, + {"minecraft:bamboo_fence_gate", 604}, + {"minecraft:bamboo_hanging_sign", 232}, + {"minecraft:bamboo_mosaic", 24}, + {"minecraft:bamboo_mosaic_slab", 577}, + {"minecraft:bamboo_mosaic_stairs", 490}, + {"minecraft:bamboo_planks", 23}, + {"minecraft:bamboo_pressure_plate", 257}, + {"minecraft:bamboo_sapling", 758}, + {"minecraft:bamboo_sign", 206}, + {"minecraft:bamboo_slab", 576}, + {"minecraft:bamboo_stairs", 489}, + {"minecraft:bamboo_trapdoor", 310}, + {"minecraft:bamboo_wall_hanging_sign", 244}, + {"minecraft:bamboo_wall_sign", 220}, + {"minecraft:barrel", 806}, + {"minecraft:barrier", 492}, + {"minecraft:basalt", 275}, + {"minecraft:beacon", 377}, + {"minecraft:bedrock", 34}, + {"minecraft:bee_nest", 870}, + {"minecraft:beehive", 871}, + {"minecraft:beetroots", 633}, + {"minecraft:bell", 815}, + {"minecraft:big_dripleaf", 1053}, + {"minecraft:big_dripleaf_stem", 1054}, + {"minecraft:birch_button", 413}, + {"minecraft:birch_door", 615}, + {"minecraft:birch_fence", 606}, + {"minecraft:birch_fence_gate", 597}, + {"minecraft:birch_hanging_sign", 223}, + {"minecraft:birch_leaves", 90}, + {"minecraft:birch_log", 51}, + {"minecraft:birch_planks", 15}, + {"minecraft:birch_pressure_plate", 250}, + {"minecraft:birch_sapling", 27}, + {"minecraft:birch_sign", 199}, + {"minecraft:birch_slab", 569}, + {"minecraft:birch_stairs", 374}, + {"minecraft:birch_trapdoor", 303}, + {"minecraft:birch_wall_hanging_sign", 235}, + {"minecraft:birch_wall_sign", 213}, + {"minecraft:birch_wood", 73}, + {"minecraft:black_banner", 546}, + {"minecraft:black_bed", 125}, + {"minecraft:black_candle", 919}, + {"minecraft:black_candle_cake", 936}, + {"minecraft:black_carpet", 521}, + {"minecraft:black_concrete", 693}, + {"minecraft:black_concrete_powder", 709}, + {"minecraft:black_glazed_terracotta", 677}, + {"minecraft:black_shulker_box", 661}, + {"minecraft:black_stained_glass", 300}, + {"minecraft:black_stained_glass_pane", 483}, + {"minecraft:black_terracotta", 467}, + {"minecraft:black_wall_banner", 562}, + {"minecraft:black_wool", 155}, + {"minecraft:blackstone", 883}, + {"minecraft:blackstone_slab", 886}, + {"minecraft:blackstone_stairs", 884}, + {"minecraft:blackstone_wall", 885}, + {"minecraft:blast_furnace", 808}, + {"minecraft:blue_banner", 542}, + {"minecraft:blue_bed", 121}, + {"minecraft:blue_candle", 915}, + {"minecraft:blue_candle_cake", 932}, + {"minecraft:blue_carpet", 517}, + {"minecraft:blue_concrete", 689}, + {"minecraft:blue_concrete_powder", 705}, + {"minecraft:blue_glazed_terracotta", 673}, + {"minecraft:blue_ice", 756}, + {"minecraft:blue_orchid", 160}, + {"minecraft:blue_shulker_box", 657}, + {"minecraft:blue_stained_glass", 296}, + {"minecraft:blue_stained_glass_pane", 479}, + {"minecraft:blue_terracotta", 463}, + {"minecraft:blue_wall_banner", 558}, + {"minecraft:blue_wool", 151}, + {"minecraft:bone_block", 642}, + {"minecraft:bookshelf", 177}, + {"minecraft:brain_coral", 731}, + {"minecraft:brain_coral_block", 721}, + {"minecraft:brain_coral_fan", 741}, + {"minecraft:brain_coral_wall_fan", 751}, + {"minecraft:brewing_stand", 355}, + {"minecraft:brick_slab", 584}, + {"minecraft:brick_stairs", 339}, + {"minecraft:brick_wall", 791}, + {"minecraft:bricks", 175}, + {"minecraft:brown_banner", 543}, + {"minecraft:brown_bed", 122}, + {"minecraft:brown_candle", 916}, + {"minecraft:brown_candle_cake", 933}, + {"minecraft:brown_carpet", 518}, + {"minecraft:brown_concrete", 690}, + {"minecraft:brown_concrete_powder", 706}, + {"minecraft:brown_glazed_terracotta", 674}, + {"minecraft:brown_mushroom", 171}, + {"minecraft:brown_mushroom_block", 323}, + {"minecraft:brown_shulker_box", 658}, + {"minecraft:brown_stained_glass", 297}, + {"minecraft:brown_stained_glass_pane", 480}, + {"minecraft:brown_terracotta", 464}, + {"minecraft:brown_wall_banner", 559}, + {"minecraft:brown_wool", 152}, + {"minecraft:bubble_column", 763}, + {"minecraft:bubble_coral", 732}, + {"minecraft:bubble_coral_block", 722}, + {"minecraft:bubble_coral_fan", 742}, + {"minecraft:bubble_coral_wall_fan", 752}, + {"minecraft:budding_amethyst", 938}, + {"minecraft:bush", 133}, + {"minecraft:cactus", 266}, + {"minecraft:cactus_flower", 267}, + {"minecraft:cake", 283}, + {"minecraft:calcite", 957}, + {"minecraft:calibrated_sculk_sensor", 961}, + {"minecraft:campfire", 818}, + {"minecraft:candle", 903}, + {"minecraft:candle_cake", 920}, + {"minecraft:carrots", 409}, + {"minecraft:cartography_table", 809}, + {"minecraft:carved_pumpkin", 281}, + {"minecraft:cauldron", 356}, + {"minecraft:cave_air", 762}, + {"minecraft:cave_vines", 1043}, + {"minecraft:cave_vines_plant", 1044}, + {"minecraft:chain", 327}, + {"minecraft:chain_command_block", 637}, + {"minecraft:cherry_button", 416}, + {"minecraft:cherry_door", 618}, + {"minecraft:cherry_fence", 609}, + {"minecraft:cherry_fence_gate", 600}, + {"minecraft:cherry_hanging_sign", 225}, + {"minecraft:cherry_leaves", 93}, + {"minecraft:cherry_log", 54}, + {"minecraft:cherry_planks", 18}, + {"minecraft:cherry_pressure_plate", 253}, + {"minecraft:cherry_sapling", 30}, + {"minecraft:cherry_sign", 201}, + {"minecraft:cherry_slab", 572}, + {"minecraft:cherry_stairs", 485}, + {"minecraft:cherry_trapdoor", 306}, + {"minecraft:cherry_wall_hanging_sign", 237}, + {"minecraft:cherry_wall_sign", 215}, + {"minecraft:cherry_wood", 76}, + {"minecraft:chest", 188}, + {"minecraft:chipped_anvil", 436}, + {"minecraft:chiseled_bookshelf", 178}, + {"minecraft:chiseled_copper", 979}, + {"minecraft:chiseled_deepslate", 1076}, + {"minecraft:chiseled_nether_bricks", 900}, + {"minecraft:chiseled_polished_blackstone", 890}, + {"minecraft:chiseled_quartz_block", 447}, + {"minecraft:chiseled_red_sandstone", 564}, + {"minecraft:chiseled_resin_bricks", 349}, + {"minecraft:chiseled_sandstone", 107}, + {"minecraft:chiseled_stone_bricks", 314}, + {"minecraft:chiseled_tuff", 951}, + {"minecraft:chiseled_tuff_bricks", 956}, + {"minecraft:chorus_flower", 625}, + {"minecraft:chorus_plant", 624}, + {"minecraft:clay", 268}, + {"minecraft:closed_eyeblossom", 1100}, + {"minecraft:coal_block", 523}, + {"minecraft:coal_ore", 46}, + {"minecraft:coarse_dirt", 10}, + {"minecraft:cobbled_deepslate", 1060}, + {"minecraft:cobbled_deepslate_slab", 1062}, + {"minecraft:cobbled_deepslate_stairs", 1061}, + {"minecraft:cobbled_deepslate_wall", 1063}, + {"minecraft:cobblestone", 12}, + {"minecraft:cobblestone_slab", 583}, + {"minecraft:cobblestone_stairs", 210}, + {"minecraft:cobblestone_wall", 378}, + {"minecraft:cobweb", 129}, + {"minecraft:cocoa", 365}, + {"minecraft:command_block", 376}, + {"minecraft:comparator", 441}, + {"minecraft:composter", 868}, + {"minecraft:conduit", 757}, + {"minecraft:copper_block", 966}, + {"minecraft:copper_bulb", 1032}, + {"minecraft:copper_door", 1008}, + {"minecraft:copper_grate", 1024}, + {"minecraft:copper_ore", 970}, + {"minecraft:copper_trapdoor", 1016}, + {"minecraft:cornflower", 168}, + {"minecraft:cracked_deepslate_bricks", 1077}, + {"minecraft:cracked_deepslate_tiles", 1078}, + {"minecraft:cracked_nether_bricks", 901}, + {"minecraft:cracked_polished_blackstone_bricks", 889}, + {"minecraft:cracked_stone_bricks", 313}, + {"minecraft:crafter", 1092}, + {"minecraft:crafting_table", 193}, + {"minecraft:creaking_heart", 186}, + {"minecraft:creeper_head", 429}, + {"minecraft:creeper_wall_head", 430}, + {"minecraft:crimson_button", 856}, + {"minecraft:crimson_door", 858}, + {"minecraft:crimson_fence", 848}, + {"minecraft:crimson_fence_gate", 852}, + {"minecraft:crimson_fungus", 835}, + {"minecraft:crimson_hanging_sign", 229}, + {"minecraft:crimson_hyphae", 832}, + {"minecraft:crimson_nylium", 834}, + {"minecraft:crimson_planks", 842}, + {"minecraft:crimson_pressure_plate", 846}, + {"minecraft:crimson_roots", 841}, + {"minecraft:crimson_sign", 860}, + {"minecraft:crimson_slab", 844}, + {"minecraft:crimson_stairs", 854}, + {"minecraft:crimson_stem", 830}, + {"minecraft:crimson_trapdoor", 850}, + {"minecraft:crimson_wall_hanging_sign", 242}, + {"minecraft:crimson_wall_sign", 862}, + {"minecraft:crying_obsidian", 876}, + {"minecraft:cut_copper", 975}, + {"minecraft:cut_copper_slab", 991}, + {"minecraft:cut_copper_stairs", 987}, + {"minecraft:cut_red_sandstone", 565}, + {"minecraft:cut_red_sandstone_slab", 590}, + {"minecraft:cut_sandstone", 108}, + {"minecraft:cut_sandstone_slab", 581}, + {"minecraft:cyan_banner", 540}, + {"minecraft:cyan_bed", 119}, + {"minecraft:cyan_candle", 913}, + {"minecraft:cyan_candle_cake", 930}, + {"minecraft:cyan_carpet", 515}, + {"minecraft:cyan_concrete", 687}, + {"minecraft:cyan_concrete_powder", 703}, + {"minecraft:cyan_glazed_terracotta", 671}, + {"minecraft:cyan_shulker_box", 655}, + {"minecraft:cyan_stained_glass", 294}, + {"minecraft:cyan_stained_glass_pane", 477}, + {"minecraft:cyan_terracotta", 461}, + {"minecraft:cyan_wall_banner", 556}, + {"minecraft:cyan_wool", 149}, + {"minecraft:damaged_anvil", 437}, + {"minecraft:dandelion", 157}, + {"minecraft:dark_oak_button", 417}, + {"minecraft:dark_oak_door", 619}, + {"minecraft:dark_oak_fence", 610}, + {"minecraft:dark_oak_fence_gate", 601}, + {"minecraft:dark_oak_hanging_sign", 227}, + {"minecraft:dark_oak_leaves", 94}, + {"minecraft:dark_oak_log", 55}, + {"minecraft:dark_oak_planks", 19}, + {"minecraft:dark_oak_pressure_plate", 254}, + {"minecraft:dark_oak_sapling", 31}, + {"minecraft:dark_oak_sign", 203}, + {"minecraft:dark_oak_slab", 573}, + {"minecraft:dark_oak_stairs", 486}, + {"minecraft:dark_oak_trapdoor", 307}, + {"minecraft:dark_oak_wall_hanging_sign", 239}, + {"minecraft:dark_oak_wall_sign", 217}, + {"minecraft:dark_oak_wood", 77}, + {"minecraft:dark_prismarine", 497}, + {"minecraft:dark_prismarine_slab", 503}, + {"minecraft:dark_prismarine_stairs", 500}, + {"minecraft:daylight_detector", 442}, + {"minecraft:dead_brain_coral", 726}, + {"minecraft:dead_brain_coral_block", 716}, + {"minecraft:dead_brain_coral_fan", 736}, + {"minecraft:dead_brain_coral_wall_fan", 746}, + {"minecraft:dead_bubble_coral", 727}, + {"minecraft:dead_bubble_coral_block", 717}, + {"minecraft:dead_bubble_coral_fan", 737}, + {"minecraft:dead_bubble_coral_wall_fan", 747}, + {"minecraft:dead_bush", 132}, + {"minecraft:dead_fire_coral", 728}, + {"minecraft:dead_fire_coral_block", 718}, + {"minecraft:dead_fire_coral_fan", 738}, + {"minecraft:dead_fire_coral_wall_fan", 748}, + {"minecraft:dead_horn_coral", 729}, + {"minecraft:dead_horn_coral_block", 719}, + {"minecraft:dead_horn_coral_fan", 739}, + {"minecraft:dead_horn_coral_wall_fan", 749}, + {"minecraft:dead_tube_coral", 725}, + {"minecraft:dead_tube_coral_block", 715}, + {"minecraft:dead_tube_coral_fan", 735}, + {"minecraft:dead_tube_coral_wall_fan", 745}, + {"minecraft:decorated_pot", 1091}, + {"minecraft:deepslate", 1059}, + {"minecraft:deepslate_brick_slab", 1074}, + {"minecraft:deepslate_brick_stairs", 1073}, + {"minecraft:deepslate_brick_wall", 1075}, + {"minecraft:deepslate_bricks", 1072}, + {"minecraft:deepslate_coal_ore", 47}, + {"minecraft:deepslate_copper_ore", 971}, + {"minecraft:deepslate_diamond_ore", 191}, + {"minecraft:deepslate_emerald_ore", 368}, + {"minecraft:deepslate_gold_ore", 43}, + {"minecraft:deepslate_iron_ore", 45}, + {"minecraft:deepslate_lapis_ore", 103}, + {"minecraft:deepslate_redstone_ore", 259}, + {"minecraft:deepslate_tile_slab", 1070}, + {"minecraft:deepslate_tile_stairs", 1069}, + {"minecraft:deepslate_tile_wall", 1071}, + {"minecraft:deepslate_tiles", 1068}, + {"minecraft:detector_rail", 127}, + {"minecraft:diamond_block", 192}, + {"minecraft:diamond_ore", 190}, + {"minecraft:diorite", 4}, + {"minecraft:diorite_slab", 790}, + {"minecraft:diorite_stairs", 777}, + {"minecraft:diorite_wall", 803}, + {"minecraft:dirt", 9}, + {"minecraft:dirt_path", 634}, + {"minecraft:dispenser", 105}, + {"minecraft:dragon_egg", 363}, + {"minecraft:dragon_head", 431}, + {"minecraft:dragon_wall_head", 432}, + {"minecraft:dried_kelp_block", 712}, + {"minecraft:dripstone_block", 1042}, + {"minecraft:dropper", 451}, + {"minecraft:emerald_block", 372}, + {"minecraft:emerald_ore", 367}, + {"minecraft:enchanting_table", 354}, + {"minecraft:end_gateway", 635}, + {"minecraft:end_portal", 360}, + {"minecraft:end_portal_frame", 361}, + {"minecraft:end_rod", 623}, + {"minecraft:end_stone", 362}, + {"minecraft:end_stone_brick_slab", 783}, + {"minecraft:end_stone_brick_stairs", 769}, + {"minecraft:end_stone_brick_wall", 802}, + {"minecraft:end_stone_bricks", 629}, + {"minecraft:ender_chest", 369}, + {"minecraft:exposed_chiseled_copper", 978}, + {"minecraft:exposed_copper", 967}, + {"minecraft:exposed_copper_bulb", 1033}, + {"minecraft:exposed_copper_door", 1009}, + {"minecraft:exposed_copper_grate", 1025}, + {"minecraft:exposed_copper_trapdoor", 1017}, + {"minecraft:exposed_cut_copper", 974}, + {"minecraft:exposed_cut_copper_slab", 990}, + {"minecraft:exposed_cut_copper_stairs", 986}, + {"minecraft:farmland", 195}, + {"minecraft:fern", 131}, + {"minecraft:fire", 183}, + {"minecraft:fire_coral", 733}, + {"minecraft:fire_coral_block", 723}, + {"minecraft:fire_coral_fan", 743}, + {"minecraft:fire_coral_wall_fan", 753}, + {"minecraft:firefly_bush", 1103}, + {"minecraft:fletching_table", 810}, + {"minecraft:flower_pot", 380}, + {"minecraft:flowering_azalea", 1047}, + {"minecraft:flowering_azalea_leaves", 98}, + {"minecraft:frogspawn", 1089}, + {"minecraft:frosted_ice", 638}, + {"minecraft:furnace", 196}, + {"minecraft:gilded_blackstone", 894}, + {"minecraft:glass", 101}, + {"minecraft:glass_pane", 328}, + {"minecraft:glow_lichen", 336}, + {"minecraft:glowstone", 279}, + {"minecraft:gold_block", 173}, + {"minecraft:gold_ore", 42}, + {"minecraft:granite", 2}, + {"minecraft:granite_slab", 786}, + {"minecraft:granite_stairs", 773}, + {"minecraft:granite_wall", 795}, + {"minecraft:grass_block", 8}, + {"minecraft:gravel", 40}, + {"minecraft:gray_banner", 538}, + {"minecraft:gray_bed", 117}, + {"minecraft:gray_candle", 911}, + {"minecraft:gray_candle_cake", 928}, + {"minecraft:gray_carpet", 513}, + {"minecraft:gray_concrete", 685}, + {"minecraft:gray_concrete_powder", 701}, + {"minecraft:gray_glazed_terracotta", 669}, + {"minecraft:gray_shulker_box", 653}, + {"minecraft:gray_stained_glass", 292}, + {"minecraft:gray_stained_glass_pane", 475}, + {"minecraft:gray_terracotta", 459}, + {"minecraft:gray_wall_banner", 554}, + {"minecraft:gray_wool", 147}, + {"minecraft:green_banner", 544}, + {"minecraft:green_bed", 123}, + {"minecraft:green_candle", 917}, + {"minecraft:green_candle_cake", 934}, + {"minecraft:green_carpet", 519}, + {"minecraft:green_concrete", 691}, + {"minecraft:green_concrete_powder", 707}, + {"minecraft:green_glazed_terracotta", 675}, + {"minecraft:green_shulker_box", 659}, + {"minecraft:green_stained_glass", 298}, + {"minecraft:green_stained_glass_pane", 481}, + {"minecraft:green_terracotta", 465}, + {"minecraft:green_wall_banner", 560}, + {"minecraft:green_wool", 153}, + {"minecraft:grindstone", 811}, + {"minecraft:hanging_roots", 1056}, + {"minecraft:hay_block", 505}, + {"minecraft:heavy_core", 1095}, + {"minecraft:heavy_weighted_pressure_plate", 440}, + {"minecraft:honey_block", 872}, + {"minecraft:honeycomb_block", 873}, + {"minecraft:hopper", 445}, + {"minecraft:horn_coral", 734}, + {"minecraft:horn_coral_block", 724}, + {"minecraft:horn_coral_fan", 744}, + {"minecraft:horn_coral_wall_fan", 754}, + {"minecraft:ice", 264}, + {"minecraft:infested_chiseled_stone_bricks", 322}, + {"minecraft:infested_cobblestone", 318}, + {"minecraft:infested_cracked_stone_bricks", 321}, + {"minecraft:infested_deepslate", 1079}, + {"minecraft:infested_mossy_stone_bricks", 320}, + {"minecraft:infested_stone", 317}, + {"minecraft:infested_stone_bricks", 319}, + {"minecraft:iron_bars", 326}, + {"minecraft:iron_block", 174}, + {"minecraft:iron_door", 247}, + {"minecraft:iron_ore", 44}, + {"minecraft:iron_trapdoor", 494}, + {"minecraft:jack_o_lantern", 282}, + {"minecraft:jigsaw", 865}, + {"minecraft:jukebox", 270}, + {"minecraft:jungle_button", 414}, + {"minecraft:jungle_door", 616}, + {"minecraft:jungle_fence", 607}, + {"minecraft:jungle_fence_gate", 598}, + {"minecraft:jungle_hanging_sign", 226}, + {"minecraft:jungle_leaves", 91}, + {"minecraft:jungle_log", 52}, + {"minecraft:jungle_planks", 16}, + {"minecraft:jungle_pressure_plate", 251}, + {"minecraft:jungle_sapling", 28}, + {"minecraft:jungle_sign", 202}, + {"minecraft:jungle_slab", 570}, + {"minecraft:jungle_stairs", 375}, + {"minecraft:jungle_trapdoor", 304}, + {"minecraft:jungle_wall_hanging_sign", 238}, + {"minecraft:jungle_wall_sign", 216}, + {"minecraft:jungle_wood", 74}, + {"minecraft:kelp", 710}, + {"minecraft:kelp_plant", 711}, + {"minecraft:ladder", 208}, + {"minecraft:lantern", 816}, + {"minecraft:lapis_block", 104}, + {"minecraft:lapis_ore", 102}, + {"minecraft:large_amethyst_bud", 940}, + {"minecraft:large_fern", 530}, + {"minecraft:lava", 36}, + {"minecraft:lava_cauldron", 358}, + {"minecraft:leaf_litter", 1051}, + {"minecraft:lectern", 812}, + {"minecraft:lever", 245}, + {"minecraft:light", 493}, + {"minecraft:light_blue_banner", 534}, + {"minecraft:light_blue_bed", 113}, + {"minecraft:light_blue_candle", 907}, + {"minecraft:light_blue_candle_cake", 924}, + {"minecraft:light_blue_carpet", 509}, + {"minecraft:light_blue_concrete", 681}, + {"minecraft:light_blue_concrete_powder", 697}, + {"minecraft:light_blue_glazed_terracotta", 665}, + {"minecraft:light_blue_shulker_box", 649}, + {"minecraft:light_blue_stained_glass", 288}, + {"minecraft:light_blue_stained_glass_pane", 471}, + {"minecraft:light_blue_terracotta", 455}, + {"minecraft:light_blue_wall_banner", 550}, + {"minecraft:light_blue_wool", 143}, + {"minecraft:light_gray_banner", 539}, + {"minecraft:light_gray_bed", 118}, + {"minecraft:light_gray_candle", 912}, + {"minecraft:light_gray_candle_cake", 929}, + {"minecraft:light_gray_carpet", 514}, + {"minecraft:light_gray_concrete", 686}, + {"minecraft:light_gray_concrete_powder", 702}, + {"minecraft:light_gray_glazed_terracotta", 670}, + {"minecraft:light_gray_shulker_box", 654}, + {"minecraft:light_gray_stained_glass", 293}, + {"minecraft:light_gray_stained_glass_pane", 476}, + {"minecraft:light_gray_terracotta", 460}, + {"minecraft:light_gray_wall_banner", 555}, + {"minecraft:light_gray_wool", 148}, + {"minecraft:light_weighted_pressure_plate", 439}, + {"minecraft:lightning_rod", 1040}, + {"minecraft:lilac", 526}, + {"minecraft:lily_of_the_valley", 170}, + {"minecraft:lily_pad", 343}, + {"minecraft:lime_banner", 536}, + {"minecraft:lime_bed", 115}, + {"minecraft:lime_candle", 909}, + {"minecraft:lime_candle_cake", 926}, + {"minecraft:lime_carpet", 511}, + {"minecraft:lime_concrete", 683}, + {"minecraft:lime_concrete_powder", 699}, + {"minecraft:lime_glazed_terracotta", 667}, + {"minecraft:lime_shulker_box", 651}, + {"minecraft:lime_stained_glass", 290}, + {"minecraft:lime_stained_glass_pane", 473}, + {"minecraft:lime_terracotta", 457}, + {"minecraft:lime_wall_banner", 552}, + {"minecraft:lime_wool", 145}, + {"minecraft:lodestone", 882}, + {"minecraft:loom", 805}, + {"minecraft:magenta_banner", 533}, + {"minecraft:magenta_bed", 112}, + {"minecraft:magenta_candle", 906}, + {"minecraft:magenta_candle_cake", 923}, + {"minecraft:magenta_carpet", 508}, + {"minecraft:magenta_concrete", 680}, + {"minecraft:magenta_concrete_powder", 696}, + {"minecraft:magenta_glazed_terracotta", 664}, + {"minecraft:magenta_shulker_box", 648}, + {"minecraft:magenta_stained_glass", 287}, + {"minecraft:magenta_stained_glass_pane", 470}, + {"minecraft:magenta_terracotta", 454}, + {"minecraft:magenta_wall_banner", 549}, + {"minecraft:magenta_wool", 142}, + {"minecraft:magma_block", 639}, + {"minecraft:mangrove_button", 419}, + {"minecraft:mangrove_door", 621}, + {"minecraft:mangrove_fence", 612}, + {"minecraft:mangrove_fence_gate", 603}, + {"minecraft:mangrove_hanging_sign", 231}, + {"minecraft:mangrove_leaves", 96}, + {"minecraft:mangrove_log", 57}, + {"minecraft:mangrove_planks", 22}, + {"minecraft:mangrove_pressure_plate", 256}, + {"minecraft:mangrove_propagule", 33}, + {"minecraft:mangrove_roots", 58}, + {"minecraft:mangrove_sign", 205}, + {"minecraft:mangrove_slab", 575}, + {"minecraft:mangrove_stairs", 488}, + {"minecraft:mangrove_trapdoor", 309}, + {"minecraft:mangrove_wall_hanging_sign", 241}, + {"minecraft:mangrove_wall_sign", 219}, + {"minecraft:mangrove_wood", 78}, + {"minecraft:medium_amethyst_bud", 941}, + {"minecraft:melon", 330}, + {"minecraft:melon_stem", 334}, + {"minecraft:moss_block", 1052}, + {"minecraft:moss_carpet", 1048}, + {"minecraft:mossy_cobblestone", 179}, + {"minecraft:mossy_cobblestone_slab", 782}, + {"minecraft:mossy_cobblestone_stairs", 768}, + {"minecraft:mossy_cobblestone_wall", 379}, + {"minecraft:mossy_stone_brick_slab", 780}, + {"minecraft:mossy_stone_brick_stairs", 766}, + {"minecraft:mossy_stone_brick_wall", 794}, + {"minecraft:mossy_stone_bricks", 312}, + {"minecraft:moving_piston", 156}, + {"minecraft:mud", 1058}, + {"minecraft:mud_brick_slab", 586}, + {"minecraft:mud_brick_stairs", 341}, + {"minecraft:mud_brick_wall", 797}, + {"minecraft:mud_bricks", 316}, + {"minecraft:muddy_mangrove_roots", 59}, + {"minecraft:mushroom_stem", 325}, + {"minecraft:mycelium", 342}, + {"minecraft:nether_brick_fence", 351}, + {"minecraft:nether_brick_slab", 587}, + {"minecraft:nether_brick_stairs", 352}, + {"minecraft:nether_brick_wall", 798}, + {"minecraft:nether_bricks", 350}, + {"minecraft:nether_gold_ore", 48}, + {"minecraft:nether_portal", 280}, + {"minecraft:nether_quartz_ore", 444}, + {"minecraft:nether_sprouts", 829}, + {"minecraft:nether_wart", 353}, + {"minecraft:nether_wart_block", 640}, + {"minecraft:netherite_block", 874}, + {"minecraft:netherrack", 272}, + {"minecraft:note_block", 109}, + {"minecraft:oak_button", 411}, + {"minecraft:oak_door", 207}, + {"minecraft:oak_fence", 271}, + {"minecraft:oak_fence_gate", 338}, + {"minecraft:oak_hanging_sign", 221}, + {"minecraft:oak_leaves", 88}, + {"minecraft:oak_log", 49}, + {"minecraft:oak_planks", 13}, + {"minecraft:oak_pressure_plate", 248}, + {"minecraft:oak_sapling", 25}, + {"minecraft:oak_sign", 197}, + {"minecraft:oak_slab", 567}, + {"minecraft:oak_stairs", 187}, + {"minecraft:oak_trapdoor", 301}, + {"minecraft:oak_wall_hanging_sign", 233}, + {"minecraft:oak_wall_sign", 211}, + {"minecraft:oak_wood", 71}, + {"minecraft:observer", 644}, + {"minecraft:obsidian", 180}, + {"minecraft:ochre_froglight", 1086}, + {"minecraft:open_eyeblossom", 1099}, + {"minecraft:orange_banner", 532}, + {"minecraft:orange_bed", 111}, + {"minecraft:orange_candle", 905}, + {"minecraft:orange_candle_cake", 922}, + {"minecraft:orange_carpet", 507}, + {"minecraft:orange_concrete", 679}, + {"minecraft:orange_concrete_powder", 695}, + {"minecraft:orange_glazed_terracotta", 663}, + {"minecraft:orange_shulker_box", 647}, + {"minecraft:orange_stained_glass", 286}, + {"minecraft:orange_stained_glass_pane", 469}, + {"minecraft:orange_terracotta", 453}, + {"minecraft:orange_tulip", 164}, + {"minecraft:orange_wall_banner", 548}, + {"minecraft:orange_wool", 141}, + {"minecraft:oxeye_daisy", 167}, + {"minecraft:oxidized_chiseled_copper", 976}, + {"minecraft:oxidized_copper", 969}, + {"minecraft:oxidized_copper_bulb", 1035}, + {"minecraft:oxidized_copper_door", 1010}, + {"minecraft:oxidized_copper_grate", 1027}, + {"minecraft:oxidized_copper_trapdoor", 1018}, + {"minecraft:oxidized_cut_copper", 972}, + {"minecraft:oxidized_cut_copper_slab", 988}, + {"minecraft:oxidized_cut_copper_stairs", 984}, + {"minecraft:packed_ice", 524}, + {"minecraft:packed_mud", 315}, + {"minecraft:pale_hanging_moss", 1098}, + {"minecraft:pale_moss_block", 1096}, + {"minecraft:pale_moss_carpet", 1097}, + {"minecraft:pale_oak_button", 418}, + {"minecraft:pale_oak_door", 620}, + {"minecraft:pale_oak_fence", 611}, + {"minecraft:pale_oak_fence_gate", 602}, + {"minecraft:pale_oak_hanging_sign", 228}, + {"minecraft:pale_oak_leaves", 95}, + {"minecraft:pale_oak_log", 56}, + {"minecraft:pale_oak_planks", 21}, + {"minecraft:pale_oak_pressure_plate", 255}, + {"minecraft:pale_oak_sapling", 32}, + {"minecraft:pale_oak_sign", 204}, + {"minecraft:pale_oak_slab", 574}, + {"minecraft:pale_oak_stairs", 487}, + {"minecraft:pale_oak_trapdoor", 308}, + {"minecraft:pale_oak_wall_hanging_sign", 240}, + {"minecraft:pale_oak_wall_sign", 218}, + {"minecraft:pale_oak_wood", 20}, + {"minecraft:pearlescent_froglight", 1088}, + {"minecraft:peony", 528}, + {"minecraft:petrified_oak_slab", 582}, + {"minecraft:piglin_head", 433}, + {"minecraft:piglin_wall_head", 434}, + {"minecraft:pink_banner", 537}, + {"minecraft:pink_bed", 116}, + {"minecraft:pink_candle", 910}, + {"minecraft:pink_candle_cake", 927}, + {"minecraft:pink_carpet", 512}, + {"minecraft:pink_concrete", 684}, + {"minecraft:pink_concrete_powder", 700}, + {"minecraft:pink_glazed_terracotta", 668}, + {"minecraft:pink_petals", 1049}, + {"minecraft:pink_shulker_box", 652}, + {"minecraft:pink_stained_glass", 291}, + {"minecraft:pink_stained_glass_pane", 474}, + {"minecraft:pink_terracotta", 458}, + {"minecraft:pink_tulip", 166}, + {"minecraft:pink_wall_banner", 553}, + {"minecraft:pink_wool", 146}, + {"minecraft:piston", 138}, + {"minecraft:piston_head", 139}, + {"minecraft:pitcher_crop", 631}, + {"minecraft:pitcher_plant", 632}, + {"minecraft:player_head", 427}, + {"minecraft:player_wall_head", 428}, + {"minecraft:podzol", 11}, + {"minecraft:pointed_dripstone", 1041}, + {"minecraft:polished_andesite", 7}, + {"minecraft:polished_andesite_slab", 789}, + {"minecraft:polished_andesite_stairs", 776}, + {"minecraft:polished_basalt", 276}, + {"minecraft:polished_blackstone", 887}, + {"minecraft:polished_blackstone_brick_slab", 891}, + {"minecraft:polished_blackstone_brick_stairs", 892}, + {"minecraft:polished_blackstone_brick_wall", 893}, + {"minecraft:polished_blackstone_bricks", 888}, + {"minecraft:polished_blackstone_button", 898}, + {"minecraft:polished_blackstone_pressure_plate", 897}, + {"minecraft:polished_blackstone_slab", 896}, + {"minecraft:polished_blackstone_stairs", 895}, + {"minecraft:polished_blackstone_wall", 899}, + {"minecraft:polished_deepslate", 1064}, + {"minecraft:polished_deepslate_slab", 1066}, + {"minecraft:polished_deepslate_stairs", 1065}, + {"minecraft:polished_deepslate_wall", 1067}, + {"minecraft:polished_diorite", 5}, + {"minecraft:polished_diorite_slab", 781}, + {"minecraft:polished_diorite_stairs", 767}, + {"minecraft:polished_granite", 3}, + {"minecraft:polished_granite_slab", 778}, + {"minecraft:polished_granite_stairs", 764}, + {"minecraft:polished_tuff", 947}, + {"minecraft:polished_tuff_slab", 948}, + {"minecraft:polished_tuff_stairs", 949}, + {"minecraft:polished_tuff_wall", 950}, + {"minecraft:poppy", 159}, + {"minecraft:potatoes", 410}, + {"minecraft:potted_acacia_sapling", 386}, + {"minecraft:potted_allium", 395}, + {"minecraft:potted_azalea_bush", 1084}, + {"minecraft:potted_azure_bluet", 396}, + {"minecraft:potted_bamboo", 760}, + {"minecraft:potted_birch_sapling", 384}, + {"minecraft:potted_blue_orchid", 394}, + {"minecraft:potted_brown_mushroom", 406}, + {"minecraft:potted_cactus", 408}, + {"minecraft:potted_cherry_sapling", 387}, + {"minecraft:potted_closed_eyeblossom", 1102}, + {"minecraft:potted_cornflower", 402}, + {"minecraft:potted_crimson_fungus", 878}, + {"minecraft:potted_crimson_roots", 880}, + {"minecraft:potted_dandelion", 392}, + {"minecraft:potted_dark_oak_sapling", 388}, + {"minecraft:potted_dead_bush", 407}, + {"minecraft:potted_fern", 391}, + {"minecraft:potted_flowering_azalea_bush", 1085}, + {"minecraft:potted_jungle_sapling", 385}, + {"minecraft:potted_lily_of_the_valley", 403}, + {"minecraft:potted_mangrove_propagule", 390}, + {"minecraft:potted_oak_sapling", 382}, + {"minecraft:potted_open_eyeblossom", 1101}, + {"minecraft:potted_orange_tulip", 398}, + {"minecraft:potted_oxeye_daisy", 401}, + {"minecraft:potted_pale_oak_sapling", 389}, + {"minecraft:potted_pink_tulip", 400}, + {"minecraft:potted_poppy", 393}, + {"minecraft:potted_red_mushroom", 405}, + {"minecraft:potted_red_tulip", 397}, + {"minecraft:potted_spruce_sapling", 383}, + {"minecraft:potted_torchflower", 381}, + {"minecraft:potted_warped_fungus", 879}, + {"minecraft:potted_warped_roots", 881}, + {"minecraft:potted_white_tulip", 399}, + {"minecraft:potted_wither_rose", 404}, + {"minecraft:powder_snow", 959}, + {"minecraft:powder_snow_cauldron", 359}, + {"minecraft:powered_rail", 126}, + {"minecraft:prismarine", 495}, + {"minecraft:prismarine_brick_slab", 502}, + {"minecraft:prismarine_brick_stairs", 499}, + {"minecraft:prismarine_bricks", 496}, + {"minecraft:prismarine_slab", 501}, + {"minecraft:prismarine_stairs", 498}, + {"minecraft:prismarine_wall", 792}, + {"minecraft:pumpkin", 329}, + {"minecraft:pumpkin_stem", 333}, + {"minecraft:purple_banner", 541}, + {"minecraft:purple_bed", 120}, + {"minecraft:purple_candle", 914}, + {"minecraft:purple_candle_cake", 931}, + {"minecraft:purple_carpet", 516}, + {"minecraft:purple_concrete", 688}, + {"minecraft:purple_concrete_powder", 704}, + {"minecraft:purple_glazed_terracotta", 672}, + {"minecraft:purple_shulker_box", 656}, + {"minecraft:purple_stained_glass", 295}, + {"minecraft:purple_stained_glass_pane", 478}, + {"minecraft:purple_terracotta", 462}, + {"minecraft:purple_wall_banner", 557}, + {"minecraft:purple_wool", 150}, + {"minecraft:purpur_block", 626}, + {"minecraft:purpur_pillar", 627}, + {"minecraft:purpur_slab", 591}, + {"minecraft:purpur_stairs", 628}, + {"minecraft:quartz_block", 446}, + {"minecraft:quartz_bricks", 902}, + {"minecraft:quartz_pillar", 448}, + {"minecraft:quartz_slab", 588}, + {"minecraft:quartz_stairs", 449}, + {"minecraft:rail", 209}, + {"minecraft:raw_copper_block", 1082}, + {"minecraft:raw_gold_block", 1083}, + {"minecraft:raw_iron_block", 1081}, + {"minecraft:red_banner", 545}, + {"minecraft:red_bed", 124}, + {"minecraft:red_candle", 918}, + {"minecraft:red_candle_cake", 935}, + {"minecraft:red_carpet", 520}, + {"minecraft:red_concrete", 692}, + {"minecraft:red_concrete_powder", 708}, + {"minecraft:red_glazed_terracotta", 676}, + {"minecraft:red_mushroom", 172}, + {"minecraft:red_mushroom_block", 324}, + {"minecraft:red_nether_brick_slab", 788}, + {"minecraft:red_nether_brick_stairs", 775}, + {"minecraft:red_nether_brick_wall", 800}, + {"minecraft:red_nether_bricks", 641}, + {"minecraft:red_sand", 39}, + {"minecraft:red_sandstone", 563}, + {"minecraft:red_sandstone_slab", 589}, + {"minecraft:red_sandstone_stairs", 566}, + {"minecraft:red_sandstone_wall", 793}, + {"minecraft:red_shulker_box", 660}, + {"minecraft:red_stained_glass", 299}, + {"minecraft:red_stained_glass_pane", 482}, + {"minecraft:red_terracotta", 466}, + {"minecraft:red_tulip", 163}, + {"minecraft:red_wall_banner", 561}, + {"minecraft:red_wool", 154}, + {"minecraft:redstone_block", 443}, + {"minecraft:redstone_lamp", 364}, + {"minecraft:redstone_ore", 258}, + {"minecraft:redstone_torch", 260}, + {"minecraft:redstone_wall_torch", 261}, + {"minecraft:redstone_wire", 189}, + {"minecraft:reinforced_deepslate", 1090}, + {"minecraft:repeater", 284}, + {"minecraft:repeating_command_block", 636}, + {"minecraft:resin_block", 344}, + {"minecraft:resin_brick_slab", 347}, + {"minecraft:resin_brick_stairs", 346}, + {"minecraft:resin_brick_wall", 348}, + {"minecraft:resin_bricks", 345}, + {"minecraft:resin_clump", 337}, + {"minecraft:respawn_anchor", 877}, + {"minecraft:rooted_dirt", 1057}, + {"minecraft:rose_bush", 527}, + {"minecraft:sand", 37}, + {"minecraft:sandstone", 106}, + {"minecraft:sandstone_slab", 580}, + {"minecraft:sandstone_stairs", 366}, + {"minecraft:sandstone_wall", 801}, + {"minecraft:scaffolding", 804}, + {"minecraft:sculk", 962}, + {"minecraft:sculk_catalyst", 964}, + {"minecraft:sculk_sensor", 960}, + {"minecraft:sculk_shrieker", 965}, + {"minecraft:sculk_vein", 963}, + {"minecraft:sea_lantern", 504}, + {"minecraft:sea_pickle", 755}, + {"minecraft:seagrass", 136}, + {"minecraft:short_dry_grass", 134}, + {"minecraft:short_grass", 130}, + {"minecraft:shroomlight", 836}, + {"minecraft:shulker_box", 645}, + {"minecraft:skeleton_skull", 421}, + {"minecraft:skeleton_wall_skull", 422}, + {"minecraft:slime_block", 491}, + {"minecraft:small_amethyst_bud", 942}, + {"minecraft:small_dripleaf", 1055}, + {"minecraft:smithing_table", 813}, + {"minecraft:smoker", 807}, + {"minecraft:smooth_basalt", 1080}, + {"minecraft:smooth_quartz", 594}, + {"minecraft:smooth_quartz_slab", 785}, + {"minecraft:smooth_quartz_stairs", 772}, + {"minecraft:smooth_red_sandstone", 595}, + {"minecraft:smooth_red_sandstone_slab", 779}, + {"minecraft:smooth_red_sandstone_stairs", 765}, + {"minecraft:smooth_sandstone", 593}, + {"minecraft:smooth_sandstone_slab", 784}, + {"minecraft:smooth_sandstone_stairs", 771}, + {"minecraft:smooth_stone", 592}, + {"minecraft:smooth_stone_slab", 579}, + {"minecraft:sniffer_egg", 714}, + {"minecraft:snow", 263}, + {"minecraft:snow_block", 265}, + {"minecraft:soul_campfire", 819}, + {"minecraft:soul_fire", 184}, + {"minecraft:soul_lantern", 817}, + {"minecraft:soul_sand", 273}, + {"minecraft:soul_soil", 274}, + {"minecraft:soul_torch", 277}, + {"minecraft:soul_wall_torch", 278}, + {"minecraft:spawner", 185}, + {"minecraft:sponge", 99}, + {"minecraft:spore_blossom", 1045}, + {"minecraft:spruce_button", 412}, + {"minecraft:spruce_door", 614}, + {"minecraft:spruce_fence", 605}, + {"minecraft:spruce_fence_gate", 596}, + {"minecraft:spruce_hanging_sign", 222}, + {"minecraft:spruce_leaves", 89}, + {"minecraft:spruce_log", 50}, + {"minecraft:spruce_planks", 14}, + {"minecraft:spruce_pressure_plate", 249}, + {"minecraft:spruce_sapling", 26}, + {"minecraft:spruce_sign", 198}, + {"minecraft:spruce_slab", 568}, + {"minecraft:spruce_stairs", 373}, + {"minecraft:spruce_trapdoor", 302}, + {"minecraft:spruce_wall_hanging_sign", 234}, + {"minecraft:spruce_wall_sign", 212}, + {"minecraft:spruce_wood", 72}, + {"minecraft:sticky_piston", 128}, + {"minecraft:stone", 1}, + {"minecraft:stone_brick_slab", 585}, + {"minecraft:stone_brick_stairs", 340}, + {"minecraft:stone_brick_wall", 796}, + {"minecraft:stone_bricks", 311}, + {"minecraft:stone_button", 262}, + {"minecraft:stone_pressure_plate", 246}, + {"minecraft:stone_slab", 578}, + {"minecraft:stone_stairs", 770}, + {"minecraft:stonecutter", 814}, + {"minecraft:stripped_acacia_log", 64}, + {"minecraft:stripped_acacia_wood", 83}, + {"minecraft:stripped_bamboo_block", 70}, + {"minecraft:stripped_birch_log", 62}, + {"minecraft:stripped_birch_wood", 81}, + {"minecraft:stripped_cherry_log", 65}, + {"minecraft:stripped_cherry_wood", 84}, + {"minecraft:stripped_crimson_hyphae", 833}, + {"minecraft:stripped_crimson_stem", 831}, + {"minecraft:stripped_dark_oak_log", 66}, + {"minecraft:stripped_dark_oak_wood", 85}, + {"minecraft:stripped_jungle_log", 63}, + {"minecraft:stripped_jungle_wood", 82}, + {"minecraft:stripped_mangrove_log", 69}, + {"minecraft:stripped_mangrove_wood", 87}, + {"minecraft:stripped_oak_log", 68}, + {"minecraft:stripped_oak_wood", 79}, + {"minecraft:stripped_pale_oak_log", 67}, + {"minecraft:stripped_pale_oak_wood", 86}, + {"minecraft:stripped_spruce_log", 61}, + {"minecraft:stripped_spruce_wood", 80}, + {"minecraft:stripped_warped_hyphae", 824}, + {"minecraft:stripped_warped_stem", 822}, + {"minecraft:structure_block", 864}, + {"minecraft:structure_void", 643}, + {"minecraft:sugar_cane", 269}, + {"minecraft:sunflower", 525}, + {"minecraft:suspicious_gravel", 41}, + {"minecraft:suspicious_sand", 38}, + {"minecraft:sweet_berry_bush", 820}, + {"minecraft:tall_dry_grass", 135}, + {"minecraft:tall_grass", 529}, + {"minecraft:tall_seagrass", 137}, + {"minecraft:target", 869}, + {"minecraft:terracotta", 522}, + {"minecraft:test_block", 866}, + {"minecraft:test_instance_block", 867}, + {"minecraft:tinted_glass", 958}, + {"minecraft:tnt", 176}, + {"minecraft:torch", 181}, + {"minecraft:torchflower", 158}, + {"minecraft:torchflower_crop", 630}, + {"minecraft:trapped_chest", 438}, + {"minecraft:trial_spawner", 1093}, + {"minecraft:tripwire", 371}, + {"minecraft:tripwire_hook", 370}, + {"minecraft:tube_coral", 730}, + {"minecraft:tube_coral_block", 720}, + {"minecraft:tube_coral_fan", 740}, + {"minecraft:tube_coral_wall_fan", 750}, + {"minecraft:tuff", 943}, + {"minecraft:tuff_brick_slab", 953}, + {"minecraft:tuff_brick_stairs", 954}, + {"minecraft:tuff_brick_wall", 955}, + {"minecraft:tuff_bricks", 952}, + {"minecraft:tuff_slab", 944}, + {"minecraft:tuff_stairs", 945}, + {"minecraft:tuff_wall", 946}, + {"minecraft:turtle_egg", 713}, + {"minecraft:twisting_vines", 839}, + {"minecraft:twisting_vines_plant", 840}, + {"minecraft:vault", 1094}, + {"minecraft:verdant_froglight", 1087}, + {"minecraft:vine", 335}, + {"minecraft:void_air", 761}, + {"minecraft:wall_torch", 182}, + {"minecraft:warped_button", 857}, + {"minecraft:warped_door", 859}, + {"minecraft:warped_fence", 849}, + {"minecraft:warped_fence_gate", 853}, + {"minecraft:warped_fungus", 826}, + {"minecraft:warped_hanging_sign", 230}, + {"minecraft:warped_hyphae", 823}, + {"minecraft:warped_nylium", 825}, + {"minecraft:warped_planks", 843}, + {"minecraft:warped_pressure_plate", 847}, + {"minecraft:warped_roots", 828}, + {"minecraft:warped_sign", 861}, + {"minecraft:warped_slab", 845}, + {"minecraft:warped_stairs", 855}, + {"minecraft:warped_stem", 821}, + {"minecraft:warped_trapdoor", 851}, + {"minecraft:warped_wall_hanging_sign", 243}, + {"minecraft:warped_wall_sign", 863}, + {"minecraft:warped_wart_block", 827}, + {"minecraft:water", 35}, + {"minecraft:water_cauldron", 357}, + {"minecraft:waxed_chiseled_copper", 983}, + {"minecraft:waxed_copper_block", 992}, + {"minecraft:waxed_copper_bulb", 1036}, + {"minecraft:waxed_copper_door", 1012}, + {"minecraft:waxed_copper_grate", 1028}, + {"minecraft:waxed_copper_trapdoor", 1020}, + {"minecraft:waxed_cut_copper", 999}, + {"minecraft:waxed_cut_copper_slab", 1007}, + {"minecraft:waxed_cut_copper_stairs", 1003}, + {"minecraft:waxed_exposed_chiseled_copper", 982}, + {"minecraft:waxed_exposed_copper", 994}, + {"minecraft:waxed_exposed_copper_bulb", 1037}, + {"minecraft:waxed_exposed_copper_door", 1013}, + {"minecraft:waxed_exposed_copper_grate", 1029}, + {"minecraft:waxed_exposed_copper_trapdoor", 1021}, + {"minecraft:waxed_exposed_cut_copper", 998}, + {"minecraft:waxed_exposed_cut_copper_slab", 1006}, + {"minecraft:waxed_exposed_cut_copper_stairs", 1002}, + {"minecraft:waxed_oxidized_chiseled_copper", 980}, + {"minecraft:waxed_oxidized_copper", 995}, + {"minecraft:waxed_oxidized_copper_bulb", 1039}, + {"minecraft:waxed_oxidized_copper_door", 1014}, + {"minecraft:waxed_oxidized_copper_grate", 1031}, + {"minecraft:waxed_oxidized_copper_trapdoor", 1022}, + {"minecraft:waxed_oxidized_cut_copper", 996}, + {"minecraft:waxed_oxidized_cut_copper_slab", 1004}, + {"minecraft:waxed_oxidized_cut_copper_stairs", 1000}, + {"minecraft:waxed_weathered_chiseled_copper", 981}, + {"minecraft:waxed_weathered_copper", 993}, + {"minecraft:waxed_weathered_copper_bulb", 1038}, + {"minecraft:waxed_weathered_copper_door", 1015}, + {"minecraft:waxed_weathered_copper_grate", 1030}, + {"minecraft:waxed_weathered_copper_trapdoor", 1023}, + {"minecraft:waxed_weathered_cut_copper", 997}, + {"minecraft:waxed_weathered_cut_copper_slab", 1005}, + {"minecraft:waxed_weathered_cut_copper_stairs", 1001}, + {"minecraft:weathered_chiseled_copper", 977}, + {"minecraft:weathered_copper", 968}, + {"minecraft:weathered_copper_bulb", 1034}, + {"minecraft:weathered_copper_door", 1011}, + {"minecraft:weathered_copper_grate", 1026}, + {"minecraft:weathered_copper_trapdoor", 1019}, + {"minecraft:weathered_cut_copper", 973}, + {"minecraft:weathered_cut_copper_slab", 989}, + {"minecraft:weathered_cut_copper_stairs", 985}, + {"minecraft:weeping_vines", 837}, + {"minecraft:weeping_vines_plant", 838}, + {"minecraft:wet_sponge", 100}, + {"minecraft:wheat", 194}, + {"minecraft:white_banner", 531}, + {"minecraft:white_bed", 110}, + {"minecraft:white_candle", 904}, + {"minecraft:white_candle_cake", 921}, + {"minecraft:white_carpet", 506}, + {"minecraft:white_concrete", 678}, + {"minecraft:white_concrete_powder", 694}, + {"minecraft:white_glazed_terracotta", 662}, + {"minecraft:white_shulker_box", 646}, + {"minecraft:white_stained_glass", 285}, + {"minecraft:white_stained_glass_pane", 468}, + {"minecraft:white_terracotta", 452}, + {"minecraft:white_tulip", 165}, + {"minecraft:white_wall_banner", 547}, + {"minecraft:white_wool", 140}, + {"minecraft:wildflowers", 1050}, + {"minecraft:wither_rose", 169}, + {"minecraft:wither_skeleton_skull", 423}, + {"minecraft:wither_skeleton_wall_skull", 424}, + {"minecraft:yellow_banner", 535}, + {"minecraft:yellow_bed", 114}, + {"minecraft:yellow_candle", 908}, + {"minecraft:yellow_candle_cake", 925}, + {"minecraft:yellow_carpet", 510}, + {"minecraft:yellow_concrete", 682}, + {"minecraft:yellow_concrete_powder", 698}, + {"minecraft:yellow_glazed_terracotta", 666}, + {"minecraft:yellow_shulker_box", 650}, + {"minecraft:yellow_stained_glass", 289}, + {"minecraft:yellow_stained_glass_pane", 472}, + {"minecraft:yellow_terracotta", 456}, + {"minecraft:yellow_wall_banner", 551}, + {"minecraft:yellow_wool", 144}, + {"minecraft:zombie_head", 425}, + {"minecraft:zombie_wall_head", 426}, + }}, + {"minecraft:block_entity_type", + { + {"minecraft:banner", 20}, + {"minecraft:barrel", 27}, + {"minecraft:beacon", 15}, + {"minecraft:bed", 25}, + {"minecraft:beehive", 34}, + {"minecraft:bell", 31}, + {"minecraft:blast_furnace", 29}, + {"minecraft:brewing_stand", 12}, + {"minecraft:brushable_block", 40}, + {"minecraft:calibrated_sculk_sensor", 36}, + {"minecraft:campfire", 33}, + {"minecraft:chest", 1}, + {"minecraft:chiseled_bookshelf", 39}, + {"minecraft:command_block", 23}, + {"minecraft:comparator", 19}, + {"minecraft:conduit", 26}, + {"minecraft:crafter", 42}, + {"minecraft:creaking_heart", 10}, + {"minecraft:daylight_detector", 17}, + {"minecraft:decorated_pot", 41}, + {"minecraft:dispenser", 5}, + {"minecraft:dropper", 6}, + {"minecraft:enchanting_table", 13}, + {"minecraft:end_gateway", 22}, + {"minecraft:end_portal", 14}, + {"minecraft:ender_chest", 3}, + {"minecraft:furnace", 0}, + {"minecraft:hanging_sign", 8}, + {"minecraft:hopper", 18}, + {"minecraft:jigsaw", 32}, + {"minecraft:jukebox", 4}, + {"minecraft:lectern", 30}, + {"minecraft:mob_spawner", 9}, + {"minecraft:piston", 11}, + {"minecraft:sculk_catalyst", 37}, + {"minecraft:sculk_sensor", 35}, + {"minecraft:sculk_shrieker", 38}, + {"minecraft:shulker_box", 24}, + {"minecraft:sign", 7}, + {"minecraft:skull", 16}, + {"minecraft:smoker", 28}, + {"minecraft:structure_block", 21}, + {"minecraft:test_block", 45}, + {"minecraft:test_instance_block", 46}, + {"minecraft:trapped_chest", 2}, + {"minecraft:trial_spawner", 43}, + {"minecraft:vault", 44}, + }}, + {"minecraft:block_predicate_type", + { + {"minecraft:all_of", 9}, + {"minecraft:any_of", 8}, + {"minecraft:has_sturdy_face", 3}, + {"minecraft:inside_world_bounds", 7}, + {"minecraft:matching_block_tag", 1}, + {"minecraft:matching_blocks", 0}, + {"minecraft:matching_fluids", 2}, + {"minecraft:not", 10}, + {"minecraft:replaceable", 5}, + {"minecraft:solid", 4}, + {"minecraft:true", 11}, + {"minecraft:unobstructed", 12}, + {"minecraft:would_survive", 6}, + }}, + {"minecraft:block_type", + { + {"minecraft:air", 1}, + {"minecraft:amethyst", 2}, + {"minecraft:amethyst_cluster", 3}, + {"minecraft:anvil", 4}, + {"minecraft:attached_stem", 5}, + {"minecraft:azalea", 6}, + {"minecraft:bamboo_sapling", 7}, + {"minecraft:bamboo_stalk", 8}, + {"minecraft:banner", 9}, + {"minecraft:barrel", 10}, + {"minecraft:barrier", 11}, + {"minecraft:base_coral_fan", 12}, + {"minecraft:base_coral_plant", 13}, + {"minecraft:base_coral_wall_fan", 14}, + {"minecraft:beacon", 15}, + {"minecraft:bed", 16}, + {"minecraft:beehive", 17}, + {"minecraft:beetroot", 18}, + {"minecraft:bell", 19}, + {"minecraft:big_dripleaf", 20}, + {"minecraft:big_dripleaf_stem", 21}, + {"minecraft:blast_furnace", 22}, + {"minecraft:block", 0}, + {"minecraft:bonemealable_feature_placer", 83}, + {"minecraft:brewing_stand", 23}, + {"minecraft:brushable", 24}, + {"minecraft:bubble_column", 25}, + {"minecraft:budding_amethyst", 26}, + {"minecraft:bush", 27}, + {"minecraft:button", 28}, + {"minecraft:cactus", 29}, + {"minecraft:cactus_flower", 30}, + {"minecraft:cake", 31}, + {"minecraft:calibrated_sculk_sensor", 32}, + {"minecraft:campfire", 33}, + {"minecraft:candle", 35}, + {"minecraft:candle_cake", 34}, + {"minecraft:carpet", 36}, + {"minecraft:carrot", 37}, + {"minecraft:cartography_table", 38}, + {"minecraft:cauldron", 39}, + {"minecraft:cave_vines", 40}, + {"minecraft:cave_vines_plant", 41}, + {"minecraft:ceiling_hanging_sign", 42}, + {"minecraft:chain", 43}, + {"minecraft:chest", 44}, + {"minecraft:chiseled_book_shelf", 45}, + {"minecraft:chorus_flower", 46}, + {"minecraft:chorus_plant", 47}, + {"minecraft:cocoa", 48}, + {"minecraft:colored_falling", 49}, + {"minecraft:command", 50}, + {"minecraft:comparator", 51}, + {"minecraft:composter", 52}, + {"minecraft:concrete_powder", 53}, + {"minecraft:conduit", 54}, + {"minecraft:copper_bulb_block", 55}, + {"minecraft:coral", 56}, + {"minecraft:coral_fan", 57}, + {"minecraft:coral_plant", 58}, + {"minecraft:coral_wall_fan", 59}, + {"minecraft:crafter", 60}, + {"minecraft:crafting_table", 61}, + {"minecraft:creaking_heart", 193}, + {"minecraft:crop", 62}, + {"minecraft:crying_obsidian", 63}, + {"minecraft:daylight_detector", 64}, + {"minecraft:decorated_pot", 66}, + {"minecraft:detector_rail", 67}, + {"minecraft:dirt_path", 68}, + {"minecraft:dispenser", 69}, + {"minecraft:door", 70}, + {"minecraft:double_plant", 71}, + {"minecraft:dragon_egg", 72}, + {"minecraft:drop_experience", 73}, + {"minecraft:dropper", 74}, + {"minecraft:dry_vegetation", 65}, + {"minecraft:enchantment_table", 75}, + {"minecraft:end_gateway", 77}, + {"minecraft:end_portal", 78}, + {"minecraft:end_portal_frame", 79}, + {"minecraft:end_rod", 80}, + {"minecraft:ender_chest", 76}, + {"minecraft:eyeblossom", 81}, + {"minecraft:farm", 82}, + {"minecraft:fence", 84}, + {"minecraft:fence_gate", 85}, + {"minecraft:fire", 86}, + {"minecraft:firefly_bush", 87}, + {"minecraft:fletching_table", 88}, + {"minecraft:flower", 89}, + {"minecraft:flower_bed", 145}, + {"minecraft:flower_pot", 90}, + {"minecraft:frogspawn", 91}, + {"minecraft:frosted_ice", 92}, + {"minecraft:fungus", 93}, + {"minecraft:furnace", 94}, + {"minecraft:glazed_terracotta", 95}, + {"minecraft:glow_lichen", 96}, + {"minecraft:grass", 97}, + {"minecraft:grindstone", 98}, + {"minecraft:half_transparent", 99}, + {"minecraft:hanging_moss", 100}, + {"minecraft:hanging_roots", 101}, + {"minecraft:hay", 102}, + {"minecraft:heavy_core", 103}, + {"minecraft:honey", 104}, + {"minecraft:hopper", 105}, + {"minecraft:huge_mushroom", 106}, + {"minecraft:ice", 107}, + {"minecraft:infested", 108}, + {"minecraft:infested_rotated_pillar", 109}, + {"minecraft:iron_bars", 110}, + {"minecraft:jack_o_lantern", 111}, + {"minecraft:jigsaw", 112}, + {"minecraft:jukebox", 113}, + {"minecraft:kelp", 114}, + {"minecraft:kelp_plant", 115}, + {"minecraft:ladder", 116}, + {"minecraft:lantern", 117}, + {"minecraft:lava_cauldron", 118}, + {"minecraft:layered_cauldron", 119}, + {"minecraft:leaf_litter", 120}, + {"minecraft:lectern", 121}, + {"minecraft:lever", 122}, + {"minecraft:light", 123}, + {"minecraft:lightning_rod", 124}, + {"minecraft:liquid", 125}, + {"minecraft:loom", 126}, + {"minecraft:magma", 127}, + {"minecraft:mangrove_leaves", 128}, + {"minecraft:mangrove_propagule", 129}, + {"minecraft:mangrove_roots", 130}, + {"minecraft:mossy_carpet", 131}, + {"minecraft:moving_piston", 132}, + {"minecraft:mud", 133}, + {"minecraft:multiface", 134}, + {"minecraft:mushroom", 135}, + {"minecraft:mycelium", 136}, + {"minecraft:nether_portal", 137}, + {"minecraft:nether_sprouts", 139}, + {"minecraft:nether_wart", 140}, + {"minecraft:netherrack", 138}, + {"minecraft:note", 141}, + {"minecraft:nylium", 142}, + {"minecraft:observer", 143}, + {"minecraft:piglinwallskull", 144}, + {"minecraft:piston_base", 146}, + {"minecraft:piston_head", 147}, + {"minecraft:pitcher_crop", 148}, + {"minecraft:player_head", 149}, + {"minecraft:player_wall_head", 150}, + {"minecraft:pointed_dripstone", 151}, + {"minecraft:potato", 152}, + {"minecraft:powder_snow", 153}, + {"minecraft:powered", 154}, + {"minecraft:powered_rail", 155}, + {"minecraft:pressure_plate", 156}, + {"minecraft:pumpkin", 157}, + {"minecraft:rail", 158}, + {"minecraft:redstone_lamp", 159}, + {"minecraft:redstone_ore", 160}, + {"minecraft:redstone_torch", 161}, + {"minecraft:redstone_wall_torch", 162}, + {"minecraft:redstone_wire", 163}, + {"minecraft:repeater", 164}, + {"minecraft:respawn_anchor", 165}, + {"minecraft:rooted_dirt", 166}, + {"minecraft:roots", 167}, + {"minecraft:rotated_pillar", 168}, + {"minecraft:sand", 170}, + {"minecraft:sapling", 169}, + {"minecraft:scaffolding", 171}, + {"minecraft:sculk", 173}, + {"minecraft:sculk_catalyst", 172}, + {"minecraft:sculk_sensor", 174}, + {"minecraft:sculk_shrieker", 175}, + {"minecraft:sculk_vein", 176}, + {"minecraft:sea_pickle", 178}, + {"minecraft:seagrass", 177}, + {"minecraft:short_dry_grass", 179}, + {"minecraft:shulker_box", 180}, + {"minecraft:skull", 181}, + {"minecraft:slab", 182}, + {"minecraft:slime", 183}, + {"minecraft:small_dripleaf", 184}, + {"minecraft:smithing_table", 185}, + {"minecraft:smoker", 186}, + {"minecraft:sniffer_egg", 187}, + {"minecraft:snow_layer", 188}, + {"minecraft:snowy_dirt", 189}, + {"minecraft:soul_fire", 190}, + {"minecraft:soul_sand", 191}, + {"minecraft:spawner", 192}, + {"minecraft:sponge", 194}, + {"minecraft:spore_blossom", 195}, + {"minecraft:stained_glass", 197}, + {"minecraft:stained_glass_pane", 196}, + {"minecraft:stair", 198}, + {"minecraft:standing_sign", 199}, + {"minecraft:stem", 200}, + {"minecraft:stonecutter", 201}, + {"minecraft:structure", 202}, + {"minecraft:structure_void", 203}, + {"minecraft:sugar_cane", 204}, + {"minecraft:sweet_berry_bush", 205}, + {"minecraft:tall_dry_grass", 206}, + {"minecraft:tall_flower", 207}, + {"minecraft:tall_grass", 208}, + {"minecraft:tall_seagrass", 209}, + {"minecraft:target", 210}, + {"minecraft:terracotta", 211}, + {"minecraft:test", 212}, + {"minecraft:test_instance", 213}, + {"minecraft:tinted_glass", 214}, + {"minecraft:tinted_particle_leaves", 215}, + {"minecraft:tnt", 216}, + {"minecraft:torch", 218}, + {"minecraft:torchflower_crop", 217}, + {"minecraft:transparent", 219}, + {"minecraft:trapdoor", 220}, + {"minecraft:trapped_chest", 221}, + {"minecraft:trial_spawner", 222}, + {"minecraft:trip_wire_hook", 223}, + {"minecraft:tripwire", 224}, + {"minecraft:turtle_egg", 225}, + {"minecraft:twisting_vines", 227}, + {"minecraft:twisting_vines_plant", 226}, + {"minecraft:untinted_particle_leaves", 228}, + {"minecraft:vault", 229}, + {"minecraft:vine", 230}, + {"minecraft:wall", 236}, + {"minecraft:wall_banner", 231}, + {"minecraft:wall_hanging_sign", 232}, + {"minecraft:wall_sign", 233}, + {"minecraft:wall_skull", 234}, + {"minecraft:wall_torch", 235}, + {"minecraft:waterlily", 237}, + {"minecraft:waterlogged_transparent", 238}, + {"minecraft:weathering_copper_bulb", 239}, + {"minecraft:weathering_copper_door", 240}, + {"minecraft:weathering_copper_full", 241}, + {"minecraft:weathering_copper_grate", 242}, + {"minecraft:weathering_copper_slab", 243}, + {"minecraft:weathering_copper_stair", 244}, + {"minecraft:weathering_copper_trap_door", 245}, + {"minecraft:web", 246}, + {"minecraft:weeping_vines", 248}, + {"minecraft:weeping_vines_plant", 247}, + {"minecraft:weighted_pressure_plate", 249}, + {"minecraft:wet_sponge", 250}, + {"minecraft:wither_rose", 251}, + {"minecraft:wither_skull", 252}, + {"minecraft:wither_wall_skull", 253}, + {"minecraft:wool_carpet", 254}, + }}, + {"minecraft:chunk_status", + { + {"minecraft:biomes", 3}, + {"minecraft:carvers", 6}, + {"minecraft:empty", 0}, + {"minecraft:features", 7}, + {"minecraft:full", 11}, + {"minecraft:initialize_light", 8}, + {"minecraft:light", 9}, + {"minecraft:noise", 4}, + {"minecraft:spawn", 10}, + {"minecraft:structure_references", 2}, + {"minecraft:structure_starts", 1}, + {"minecraft:surface", 5}, + }}, + {"minecraft:command_argument_type", + { + {"brigadier:bool", 0}, + {"brigadier:double", 2}, + {"brigadier:float", 1}, + {"brigadier:integer", 3}, + {"brigadier:long", 4}, + {"brigadier:string", 5}, + {"minecraft:angle", 27}, + {"minecraft:block_pos", 8}, + {"minecraft:block_predicate", 13}, + {"minecraft:block_state", 12}, + {"minecraft:color", 16}, + {"minecraft:column_pos", 9}, + {"minecraft:component", 17}, + {"minecraft:dimension", 40}, + {"minecraft:entity", 6}, + {"minecraft:entity_anchor", 37}, + {"minecraft:float_range", 39}, + {"minecraft:function", 36}, + {"minecraft:game_profile", 7}, + {"minecraft:gamemode", 41}, + {"minecraft:heightmap", 50}, + {"minecraft:int_range", 38}, + {"minecraft:item_predicate", 15}, + {"minecraft:item_slot", 33}, + {"minecraft:item_slots", 34}, + {"minecraft:item_stack", 14}, + {"minecraft:loot_modifier", 53}, + {"minecraft:loot_predicate", 52}, + {"minecraft:loot_table", 51}, + {"minecraft:message", 19}, + {"minecraft:nbt_compound_tag", 20}, + {"minecraft:nbt_path", 22}, + {"minecraft:nbt_tag", 21}, + {"minecraft:objective", 23}, + {"minecraft:objective_criteria", 24}, + {"minecraft:operation", 25}, + {"minecraft:particle", 26}, + {"minecraft:resource", 45}, + {"minecraft:resource_key", 46}, + {"minecraft:resource_location", 35}, + {"minecraft:resource_or_tag", 43}, + {"minecraft:resource_or_tag_key", 44}, + {"minecraft:resource_selector", 47}, + {"minecraft:rotation", 28}, + {"minecraft:score_holder", 30}, + {"minecraft:scoreboard_slot", 29}, + {"minecraft:style", 18}, + {"minecraft:swizzle", 31}, + {"minecraft:team", 32}, + {"minecraft:template_mirror", 48}, + {"minecraft:template_rotation", 49}, + {"minecraft:time", 42}, + {"minecraft:uuid", 54}, + {"minecraft:vec2", 11}, + {"minecraft:vec3", 10}, + }}, + {"minecraft:consume_effect_type", + { + {"minecraft:apply_effects", 0}, + {"minecraft:clear_all_effects", 2}, + {"minecraft:play_sound", 4}, + {"minecraft:remove_effects", 1}, + {"minecraft:teleport_randomly", 3}, + }}, + {"minecraft:creative_mode_tab", + { + {"minecraft:building_blocks", 0}, + {"minecraft:colored_blocks", 1}, + {"minecraft:combat", 8}, + {"minecraft:food_and_drinks", 9}, + {"minecraft:functional_blocks", 3}, + {"minecraft:hotbar", 5}, + {"minecraft:ingredients", 10}, + {"minecraft:inventory", 13}, + {"minecraft:natural_blocks", 2}, + {"minecraft:op_blocks", 12}, + {"minecraft:redstone_blocks", 4}, + {"minecraft:search", 6}, + {"minecraft:spawn_eggs", 11}, + {"minecraft:tools_and_utilities", 7}, + }}, + {"minecraft:custom_stat", + { + {"minecraft:animals_bred", 32}, + {"minecraft:aviate_one_cm", 18}, + {"minecraft:bell_ring", 68}, + {"minecraft:boat_one_cm", 15}, + {"minecraft:clean_armor", 40}, + {"minecraft:clean_banner", 41}, + {"minecraft:clean_shulker_box", 42}, + {"minecraft:climb_one_cm", 11}, + {"minecraft:crouch_one_cm", 7}, + {"minecraft:damage_absorbed", 28}, + {"minecraft:damage_blocked_by_shield", 27}, + {"minecraft:damage_dealt", 23}, + {"minecraft:damage_dealt_absorbed", 24}, + {"minecraft:damage_dealt_resisted", 25}, + {"minecraft:damage_resisted", 29}, + {"minecraft:damage_taken", 26}, + {"minecraft:deaths", 30}, + {"minecraft:drop", 22}, + {"minecraft:eat_cake_slice", 37}, + {"minecraft:enchant_item", 53}, + {"minecraft:fall_one_cm", 10}, + {"minecraft:fill_cauldron", 38}, + {"minecraft:fish_caught", 34}, + {"minecraft:fly_one_cm", 12}, + {"minecraft:horse_one_cm", 17}, + {"minecraft:inspect_dispenser", 47}, + {"minecraft:inspect_dropper", 45}, + {"minecraft:inspect_hopper", 46}, + {"minecraft:interact_with_anvil", 71}, + {"minecraft:interact_with_beacon", 44}, + {"minecraft:interact_with_blast_furnace", 61}, + {"minecraft:interact_with_brewingstand", 43}, + {"minecraft:interact_with_campfire", 64}, + {"minecraft:interact_with_cartography_table", 65}, + {"minecraft:interact_with_crafting_table", 56}, + {"minecraft:interact_with_furnace", 55}, + {"minecraft:interact_with_grindstone", 72}, + {"minecraft:interact_with_lectern", 63}, + {"minecraft:interact_with_loom", 66}, + {"minecraft:interact_with_smithing_table", 74}, + {"minecraft:interact_with_smoker", 62}, + {"minecraft:interact_with_stonecutter", 67}, + {"minecraft:jump", 21}, + {"minecraft:leave_game", 0}, + {"minecraft:minecart_one_cm", 14}, + {"minecraft:mob_kills", 31}, + {"minecraft:open_barrel", 60}, + {"minecraft:open_chest", 57}, + {"minecraft:open_enderchest", 52}, + {"minecraft:open_shulker_box", 59}, + {"minecraft:pig_one_cm", 16}, + {"minecraft:play_noteblock", 48}, + {"minecraft:play_record", 54}, + {"minecraft:play_time", 1}, + {"minecraft:player_kills", 33}, + {"minecraft:pot_flower", 50}, + {"minecraft:raid_trigger", 69}, + {"minecraft:raid_win", 70}, + {"minecraft:sleep_in_bed", 58}, + {"minecraft:sneak_time", 5}, + {"minecraft:sprint_one_cm", 8}, + {"minecraft:strider_one_cm", 20}, + {"minecraft:swim_one_cm", 19}, + {"minecraft:talked_to_villager", 35}, + {"minecraft:target_hit", 73}, + {"minecraft:time_since_death", 3}, + {"minecraft:time_since_rest", 4}, + {"minecraft:total_world_time", 2}, + {"minecraft:traded_with_villager", 36}, + {"minecraft:trigger_trapped_chest", 51}, + {"minecraft:tune_noteblock", 49}, + {"minecraft:use_cauldron", 39}, + {"minecraft:walk_on_water_one_cm", 9}, + {"minecraft:walk_one_cm", 6}, + {"minecraft:walk_under_water_one_cm", 13}, + }}, + {"minecraft:data_component_predicate_type", + { + {"minecraft:attribute_modifiers", 11}, + {"minecraft:bundle_contents", 6}, + {"minecraft:container", 5}, + {"minecraft:custom_data", 4}, + {"minecraft:damage", 0}, + {"minecraft:enchantments", 1}, + {"minecraft:firework_explosion", 7}, + {"minecraft:fireworks", 8}, + {"minecraft:jukebox_playable", 13}, + {"minecraft:potion_contents", 3}, + {"minecraft:stored_enchantments", 2}, + {"minecraft:trim", 12}, + {"minecraft:writable_book_content", 9}, + {"minecraft:written_book_content", 10}, + }}, + {"minecraft:data_component_type", + { + {"minecraft:attribute_modifiers", 13}, + {"minecraft:axolotl/variant", 91}, + {"minecraft:banner_patterns", 63}, + {"minecraft:base_color", 64}, + {"minecraft:bees", 68}, + {"minecraft:block_entity_data", 51}, + {"minecraft:block_state", 67}, + {"minecraft:blocks_attacks", 33}, + {"minecraft:break_sound", 71}, + {"minecraft:bucket_entity_data", 50}, + {"minecraft:bundle_contents", 41}, + {"minecraft:can_break", 12}, + {"minecraft:can_place_on", 11}, + {"minecraft:cat/collar", 93}, + {"minecraft:cat/variant", 92}, + {"minecraft:charged_projectiles", 40}, + {"minecraft:chicken/variant", 86}, + {"minecraft:consumable", 21}, + {"minecraft:container", 66}, + {"minecraft:container_loot", 70}, + {"minecraft:cow/variant", 85}, + {"minecraft:creative_slot_lock", 17}, + {"minecraft:custom_data", 0}, + {"minecraft:custom_model_data", 14}, + {"minecraft:custom_name", 5}, + {"minecraft:damage", 3}, + {"minecraft:damage_resistant", 24}, + {"minecraft:death_protection", 32}, + {"minecraft:debug_stick_state", 48}, + {"minecraft:dyed_color", 35}, + {"minecraft:enchantable", 27}, + {"minecraft:enchantment_glint_override", 18}, + {"minecraft:enchantments", 10}, + {"minecraft:entity_data", 49}, + {"minecraft:equippable", 28}, + {"minecraft:firework_explosion", 59}, + {"minecraft:fireworks", 60}, + {"minecraft:food", 20}, + {"minecraft:fox/variant", 76}, + {"minecraft:frog/variant", 87}, + {"minecraft:glider", 30}, + {"minecraft:horse/variant", 88}, + {"minecraft:instrument", 52}, + {"minecraft:intangible_projectile", 19}, + {"minecraft:item_model", 7}, + {"minecraft:item_name", 6}, + {"minecraft:jukebox_playable", 55}, + {"minecraft:llama/variant", 90}, + {"minecraft:lock", 69}, + {"minecraft:lodestone_tracker", 58}, + {"minecraft:lore", 8}, + {"minecraft:map_color", 36}, + {"minecraft:map_decorations", 38}, + {"minecraft:map_id", 37}, + {"minecraft:map_post_processing", 39}, + {"minecraft:max_damage", 2}, + {"minecraft:max_stack_size", 1}, + {"minecraft:mooshroom/variant", 82}, + {"minecraft:note_block_sound", 62}, + {"minecraft:ominous_bottle_amplifier", 54}, + {"minecraft:painting/variant", 89}, + {"minecraft:parrot/variant", 78}, + {"minecraft:pig/variant", 84}, + {"minecraft:pot_decorations", 65}, + {"minecraft:potion_contents", 42}, + {"minecraft:potion_duration_scale", 43}, + {"minecraft:profile", 61}, + {"minecraft:provides_banner_patterns", 56}, + {"minecraft:provides_trim_material", 53}, + {"minecraft:rabbit/variant", 83}, + {"minecraft:rarity", 9}, + {"minecraft:recipes", 57}, + {"minecraft:repair_cost", 16}, + {"minecraft:repairable", 29}, + {"minecraft:salmon/size", 77}, + {"minecraft:sheep/color", 94}, + {"minecraft:shulker/color", 95}, + {"minecraft:stored_enchantments", 34}, + {"minecraft:suspicious_stew_effects", 44}, + {"minecraft:tool", 25}, + {"minecraft:tooltip_display", 15}, + {"minecraft:tooltip_style", 31}, + {"minecraft:trim", 47}, + {"minecraft:tropical_fish/base_color", 80}, + {"minecraft:tropical_fish/pattern", 79}, + {"minecraft:tropical_fish/pattern_color", 81}, + {"minecraft:unbreakable", 4}, + {"minecraft:use_cooldown", 23}, + {"minecraft:use_remainder", 22}, + {"minecraft:villager/variant", 72}, + {"minecraft:weapon", 26}, + {"minecraft:wolf/collar", 75}, + {"minecraft:wolf/sound_variant", 74}, + {"minecraft:wolf/variant", 73}, + {"minecraft:writable_book_content", 45}, + {"minecraft:written_book_content", 46}, + }}, + {"minecraft:decorated_pot_pattern", + { + {"minecraft:angler", 0}, {"minecraft:archer", 1}, {"minecraft:arms_up", 2}, {"minecraft:blade", 3}, + {"minecraft:blank", 23}, {"minecraft:brewer", 4}, {"minecraft:burn", 5}, {"minecraft:danger", 6}, + {"minecraft:explorer", 7}, {"minecraft:flow", 8}, {"minecraft:friend", 9}, {"minecraft:guster", 10}, + {"minecraft:heart", 11}, {"minecraft:heartbreak", 12}, {"minecraft:howl", 13}, {"minecraft:miner", 14}, + {"minecraft:mourner", 15}, {"minecraft:plenty", 16}, {"minecraft:prize", 17}, {"minecraft:scrape", 18}, + {"minecraft:sheaf", 19}, {"minecraft:shelter", 20}, {"minecraft:skull", 21}, {"minecraft:snort", 22}, + }}, + {"minecraft:enchantment_effect_component_type", + { + {"minecraft:ammo_use", 13}, + {"minecraft:armor_effectiveness", 5}, + {"minecraft:attributes", 9}, + {"minecraft:block_experience", 21}, + {"minecraft:crossbow_charge_time", 24}, + {"minecraft:crossbow_charging_sounds", 25}, + {"minecraft:damage", 2}, + {"minecraft:damage_immunity", 1}, + {"minecraft:damage_protection", 0}, + {"minecraft:equipment_drops", 10}, + {"minecraft:fishing_luck_bonus", 20}, + {"minecraft:fishing_time_reduction", 19}, + {"minecraft:hit_block", 7}, + {"minecraft:item_damage", 8}, + {"minecraft:knockback", 4}, + {"minecraft:location_changed", 11}, + {"minecraft:mob_experience", 22}, + {"minecraft:post_attack", 6}, + {"minecraft:prevent_armor_change", 28}, + {"minecraft:prevent_equipment_drop", 27}, + {"minecraft:projectile_count", 17}, + {"minecraft:projectile_piercing", 14}, + {"minecraft:projectile_spawned", 15}, + {"minecraft:projectile_spread", 16}, + {"minecraft:repair_with_xp", 23}, + {"minecraft:smash_damage_per_fallen_block", 3}, + {"minecraft:tick", 12}, + {"minecraft:trident_return_acceleration", 18}, + {"minecraft:trident_sound", 26}, + {"minecraft:trident_spin_attack_strength", 29}, + }}, + {"minecraft:enchantment_entity_effect_type", + { + {"minecraft:all_of", 0}, + {"minecraft:apply_mob_effect", 1}, + {"minecraft:change_item_damage", 2}, + {"minecraft:damage_entity", 3}, + {"minecraft:explode", 4}, + {"minecraft:ignite", 5}, + {"minecraft:play_sound", 6}, + {"minecraft:replace_block", 7}, + {"minecraft:replace_disk", 8}, + {"minecraft:run_function", 9}, + {"minecraft:set_block_properties", 10}, + {"minecraft:spawn_particles", 11}, + {"minecraft:summon_entity", 12}, + }}, + {"minecraft:enchantment_level_based_value_type", + { + {"minecraft:clamped", 0}, + {"minecraft:fraction", 1}, + {"minecraft:levels_squared", 2}, + {"minecraft:linear", 3}, + {"minecraft:lookup", 4}, + }}, + {"minecraft:enchantment_location_based_effect_type", + { + {"minecraft:all_of", 0}, + {"minecraft:apply_mob_effect", 1}, + {"minecraft:attribute", 2}, + {"minecraft:change_item_damage", 3}, + {"minecraft:damage_entity", 4}, + {"minecraft:explode", 5}, + {"minecraft:ignite", 6}, + {"minecraft:play_sound", 7}, + {"minecraft:replace_block", 8}, + {"minecraft:replace_disk", 9}, + {"minecraft:run_function", 10}, + {"minecraft:set_block_properties", 11}, + {"minecraft:spawn_particles", 12}, + {"minecraft:summon_entity", 13}, + }}, + {"minecraft:enchantment_provider_type", + { + {"minecraft:by_cost", 0}, + {"minecraft:by_cost_with_difficulty", 1}, + {"minecraft:single", 2}, + }}, + {"minecraft:enchantment_value_effect_type", + { + {"minecraft:add", 0}, + {"minecraft:all_of", 1}, + {"minecraft:multiply", 2}, + {"minecraft:remove_binomial", 3}, + {"minecraft:set", 4}, + }}, + {"minecraft:entity_sub_predicate_type", + { + {"minecraft:fishing_hook", 1}, + {"minecraft:lightning", 0}, + {"minecraft:player", 2}, + {"minecraft:raider", 4}, + {"minecraft:sheep", 5}, + {"minecraft:slime", 3}, + }}, + {"minecraft:entity_type", + { + {"minecraft:acacia_boat", 0}, + {"minecraft:acacia_chest_boat", 1}, + {"minecraft:allay", 2}, + {"minecraft:area_effect_cloud", 3}, + {"minecraft:armadillo", 4}, + {"minecraft:armor_stand", 5}, + {"minecraft:arrow", 6}, + {"minecraft:axolotl", 7}, + {"minecraft:bamboo_chest_raft", 8}, + {"minecraft:bamboo_raft", 9}, + {"minecraft:bat", 10}, + {"minecraft:bee", 11}, + {"minecraft:birch_boat", 12}, + {"minecraft:birch_chest_boat", 13}, + {"minecraft:blaze", 14}, + {"minecraft:block_display", 15}, + {"minecraft:bogged", 16}, + {"minecraft:breeze", 17}, + {"minecraft:breeze_wind_charge", 18}, + {"minecraft:camel", 19}, + {"minecraft:cat", 20}, + {"minecraft:cave_spider", 21}, + {"minecraft:cherry_boat", 22}, + {"minecraft:cherry_chest_boat", 23}, + {"minecraft:chest_minecart", 24}, + {"minecraft:chicken", 25}, + {"minecraft:cod", 26}, + {"minecraft:command_block_minecart", 27}, + {"minecraft:cow", 28}, + {"minecraft:creaking", 29}, + {"minecraft:creeper", 30}, + {"minecraft:dark_oak_boat", 31}, + {"minecraft:dark_oak_chest_boat", 32}, + {"minecraft:dolphin", 33}, + {"minecraft:donkey", 34}, + {"minecraft:dragon_fireball", 35}, + {"minecraft:drowned", 36}, + {"minecraft:egg", 37}, + {"minecraft:elder_guardian", 38}, + {"minecraft:end_crystal", 43}, + {"minecraft:ender_dragon", 41}, + {"minecraft:ender_pearl", 42}, + {"minecraft:enderman", 39}, + {"minecraft:endermite", 40}, + {"minecraft:evoker", 44}, + {"minecraft:evoker_fangs", 45}, + {"minecraft:experience_bottle", 46}, + {"minecraft:experience_orb", 47}, + {"minecraft:eye_of_ender", 48}, + {"minecraft:falling_block", 49}, + {"minecraft:fireball", 50}, + {"minecraft:firework_rocket", 51}, + {"minecraft:fishing_bobber", 149}, + {"minecraft:fox", 52}, + {"minecraft:frog", 53}, + {"minecraft:furnace_minecart", 54}, + {"minecraft:ghast", 55}, + {"minecraft:giant", 56}, + {"minecraft:glow_item_frame", 57}, + {"minecraft:glow_squid", 58}, + {"minecraft:goat", 59}, + {"minecraft:guardian", 60}, + {"minecraft:hoglin", 61}, + {"minecraft:hopper_minecart", 62}, + {"minecraft:horse", 63}, + {"minecraft:husk", 64}, + {"minecraft:illusioner", 65}, + {"minecraft:interaction", 66}, + {"minecraft:iron_golem", 67}, + {"minecraft:item", 68}, + {"minecraft:item_display", 69}, + {"minecraft:item_frame", 70}, + {"minecraft:jungle_boat", 71}, + {"minecraft:jungle_chest_boat", 72}, + {"minecraft:leash_knot", 73}, + {"minecraft:lightning_bolt", 74}, + {"minecraft:lingering_potion", 100}, + {"minecraft:llama", 75}, + {"minecraft:llama_spit", 76}, + {"minecraft:magma_cube", 77}, + {"minecraft:mangrove_boat", 78}, + {"minecraft:mangrove_chest_boat", 79}, + {"minecraft:marker", 80}, + {"minecraft:minecart", 81}, + {"minecraft:mooshroom", 82}, + {"minecraft:mule", 83}, + {"minecraft:oak_boat", 84}, + {"minecraft:oak_chest_boat", 85}, + {"minecraft:ocelot", 86}, + {"minecraft:ominous_item_spawner", 87}, + {"minecraft:painting", 88}, + {"minecraft:pale_oak_boat", 89}, + {"minecraft:pale_oak_chest_boat", 90}, + {"minecraft:panda", 91}, + {"minecraft:parrot", 92}, + {"minecraft:phantom", 93}, + {"minecraft:pig", 94}, + {"minecraft:piglin", 95}, + {"minecraft:piglin_brute", 96}, + {"minecraft:pillager", 97}, + {"minecraft:player", 148}, + {"minecraft:polar_bear", 98}, + {"minecraft:pufferfish", 101}, + {"minecraft:rabbit", 102}, + {"minecraft:ravager", 103}, + {"minecraft:salmon", 104}, + {"minecraft:sheep", 105}, + {"minecraft:shulker", 106}, + {"minecraft:shulker_bullet", 107}, + {"minecraft:silverfish", 108}, + {"minecraft:skeleton", 109}, + {"minecraft:skeleton_horse", 110}, + {"minecraft:slime", 111}, + {"minecraft:small_fireball", 112}, + {"minecraft:sniffer", 113}, + {"minecraft:snow_golem", 115}, + {"minecraft:snowball", 114}, + {"minecraft:spawner_minecart", 116}, + {"minecraft:spectral_arrow", 117}, + {"minecraft:spider", 118}, + {"minecraft:splash_potion", 99}, + {"minecraft:spruce_boat", 119}, + {"minecraft:spruce_chest_boat", 120}, + {"minecraft:squid", 121}, + {"minecraft:stray", 122}, + {"minecraft:strider", 123}, + {"minecraft:tadpole", 124}, + {"minecraft:text_display", 125}, + {"minecraft:tnt", 126}, + {"minecraft:tnt_minecart", 127}, + {"minecraft:trader_llama", 128}, + {"minecraft:trident", 129}, + {"minecraft:tropical_fish", 130}, + {"minecraft:turtle", 131}, + {"minecraft:vex", 132}, + {"minecraft:villager", 133}, + {"minecraft:vindicator", 134}, + {"minecraft:wandering_trader", 135}, + {"minecraft:warden", 136}, + {"minecraft:wind_charge", 137}, + {"minecraft:witch", 138}, + {"minecraft:wither", 139}, + {"minecraft:wither_skeleton", 140}, + {"minecraft:wither_skull", 141}, + {"minecraft:wolf", 142}, + {"minecraft:zoglin", 143}, + {"minecraft:zombie", 144}, + {"minecraft:zombie_horse", 145}, + {"minecraft:zombie_villager", 146}, + {"minecraft:zombified_piglin", 147}, + }}, + {"minecraft:float_provider_type", + { + {"minecraft:clamped_normal", 2}, + {"minecraft:constant", 0}, + {"minecraft:trapezoid", 3}, + {"minecraft:uniform", 1}, + }}, + {"minecraft:fluid", + { + {"minecraft:empty", 0}, + {"minecraft:flowing_lava", 3}, + {"minecraft:flowing_water", 1}, + {"minecraft:lava", 4}, + {"minecraft:water", 2}, + }}, + {"minecraft:game_event", + { + {"minecraft:block_activate", 0}, + {"minecraft:block_attach", 1}, + {"minecraft:block_change", 2}, + {"minecraft:block_close", 3}, + {"minecraft:block_deactivate", 4}, + {"minecraft:block_destroy", 5}, + {"minecraft:block_detach", 6}, + {"minecraft:block_open", 7}, + {"minecraft:block_place", 8}, + {"minecraft:container_close", 9}, + {"minecraft:container_open", 10}, + {"minecraft:drink", 11}, + {"minecraft:eat", 12}, + {"minecraft:elytra_glide", 13}, + {"minecraft:entity_action", 20}, + {"minecraft:entity_damage", 14}, + {"minecraft:entity_die", 15}, + {"minecraft:entity_dismount", 16}, + {"minecraft:entity_interact", 17}, + {"minecraft:entity_mount", 18}, + {"minecraft:entity_place", 19}, + {"minecraft:equip", 21}, + {"minecraft:explode", 22}, + {"minecraft:flap", 23}, + {"minecraft:fluid_pickup", 24}, + {"minecraft:fluid_place", 25}, + {"minecraft:hit_ground", 26}, + {"minecraft:instrument_play", 27}, + {"minecraft:item_interact_finish", 28}, + {"minecraft:item_interact_start", 29}, + {"minecraft:jukebox_play", 30}, + {"minecraft:jukebox_stop_play", 31}, + {"minecraft:lightning_strike", 32}, + {"minecraft:note_block_play", 33}, + {"minecraft:prime_fuse", 34}, + {"minecraft:projectile_land", 35}, + {"minecraft:projectile_shoot", 36}, + {"minecraft:resonate_1", 45}, + {"minecraft:resonate_10", 54}, + {"minecraft:resonate_11", 55}, + {"minecraft:resonate_12", 56}, + {"minecraft:resonate_13", 57}, + {"minecraft:resonate_14", 58}, + {"minecraft:resonate_15", 59}, + {"minecraft:resonate_2", 46}, + {"minecraft:resonate_3", 47}, + {"minecraft:resonate_4", 48}, + {"minecraft:resonate_5", 49}, + {"minecraft:resonate_6", 50}, + {"minecraft:resonate_7", 51}, + {"minecraft:resonate_8", 52}, + {"minecraft:resonate_9", 53}, + {"minecraft:sculk_sensor_tendrils_clicking", 37}, + {"minecraft:shear", 38}, + {"minecraft:shriek", 39}, + {"minecraft:splash", 40}, + {"minecraft:step", 41}, + {"minecraft:swim", 42}, + {"minecraft:teleport", 43}, + {"minecraft:unequip", 44}, + }}, + {"minecraft:height_provider_type", + { + {"minecraft:biased_to_bottom", 2}, + {"minecraft:constant", 0}, + {"minecraft:trapezoid", 4}, + {"minecraft:uniform", 1}, + {"minecraft:very_biased_to_bottom", 3}, + {"minecraft:weighted_list", 5}, + }}, + {"minecraft:int_provider_type", + { + {"minecraft:biased_to_bottom", 2}, + {"minecraft:clamped", 3}, + {"minecraft:clamped_normal", 5}, + {"minecraft:constant", 0}, + {"minecraft:uniform", 1}, + {"minecraft:weighted_list", 4}, + }}, + {"minecraft:item", + { + {"minecraft:acacia_boat", 818}, + {"minecraft:acacia_button", 718}, + {"minecraft:acacia_chest_boat", 819}, + {"minecraft:acacia_door", 747}, + {"minecraft:acacia_fence", 336}, + {"minecraft:acacia_fence_gate", 788}, + {"minecraft:acacia_hanging_sign", 942}, + {"minecraft:acacia_leaves", 186}, + {"minecraft:acacia_log", 138}, + {"minecraft:acacia_planks", 40}, + {"minecraft:acacia_pressure_plate", 734}, + {"minecraft:acacia_sapling", 53}, + {"minecraft:acacia_sign", 930}, + {"minecraft:acacia_slab", 274}, + {"minecraft:acacia_stairs", 416}, + {"minecraft:acacia_trapdoor", 768}, + {"minecraft:acacia_wood", 175}, + {"minecraft:activator_rail", 799}, + {"minecraft:air", 0}, + {"minecraft:allay_spawn_egg", 1069}, + {"minecraft:allium", 234}, + {"minecraft:amethyst_block", 88}, + {"minecraft:amethyst_cluster", 1325}, + {"minecraft:amethyst_shard", 849}, + {"minecraft:ancient_debris", 82}, + {"minecraft:andesite", 6}, + {"minecraft:andesite_slab", 678}, + {"minecraft:andesite_stairs", 661}, + {"minecraft:andesite_wall", 437}, + {"minecraft:angler_pottery_sherd", 1352}, + {"minecraft:anvil", 449}, + {"minecraft:apple", 840}, + {"minecraft:archer_pottery_sherd", 1353}, + {"minecraft:armadillo_scute", 836}, + {"minecraft:armadillo_spawn_egg", 1068}, + {"minecraft:armor_stand", 1186}, + {"minecraft:arms_up_pottery_sherd", 1354}, + {"minecraft:arrow", 842}, + {"minecraft:axolotl_bucket", 961}, + {"minecraft:axolotl_spawn_egg", 1070}, + {"minecraft:azalea", 205}, + {"minecraft:azalea_leaves", 191}, + {"minecraft:azure_bluet", 235}, + {"minecraft:baked_potato", 1161}, + {"minecraft:bamboo", 269}, + {"minecraft:bamboo_block", 147}, + {"minecraft:bamboo_button", 723}, + {"minecraft:bamboo_chest_raft", 829}, + {"minecraft:bamboo_door", 752}, + {"minecraft:bamboo_fence", 341}, + {"minecraft:bamboo_fence_gate", 793}, + {"minecraft:bamboo_hanging_sign", 947}, + {"minecraft:bamboo_mosaic", 48}, + {"minecraft:bamboo_mosaic_slab", 280}, + {"minecraft:bamboo_mosaic_stairs", 422}, + {"minecraft:bamboo_planks", 45}, + {"minecraft:bamboo_pressure_plate", 739}, + {"minecraft:bamboo_raft", 828}, + {"minecraft:bamboo_sign", 935}, + {"minecraft:bamboo_slab", 279}, + {"minecraft:bamboo_stairs", 421}, + {"minecraft:bamboo_trapdoor", 773}, + {"minecraft:barrel", 1269}, + {"minecraft:barrier", 473}, + {"minecraft:basalt", 350}, + {"minecraft:bat_spawn_egg", 1071}, + {"minecraft:beacon", 426}, + {"minecraft:bedrock", 58}, + {"minecraft:bee_nest", 1286}, + {"minecraft:bee_spawn_egg", 1072}, + {"minecraft:beef", 1048}, + {"minecraft:beehive", 1287}, + {"minecraft:beetroot", 1217}, + {"minecraft:beetroot_seeds", 1218}, + {"minecraft:beetroot_soup", 1219}, + {"minecraft:bell", 1277}, + {"minecraft:big_dripleaf", 267}, + {"minecraft:birch_boat", 814}, + {"minecraft:birch_button", 716}, + {"minecraft:birch_chest_boat", 815}, + {"minecraft:birch_door", 745}, + {"minecraft:birch_fence", 334}, + {"minecraft:birch_fence_gate", 786}, + {"minecraft:birch_hanging_sign", 940}, + {"minecraft:birch_leaves", 184}, + {"minecraft:birch_log", 136}, + {"minecraft:birch_planks", 38}, + {"minecraft:birch_pressure_plate", 732}, + {"minecraft:birch_sapling", 51}, + {"minecraft:birch_sign", 928}, + {"minecraft:birch_slab", 272}, + {"minecraft:birch_stairs", 414}, + {"minecraft:birch_trapdoor", 766}, + {"minecraft:birch_wood", 173}, + {"minecraft:black_banner", 1211}, + {"minecraft:black_bed", 1039}, + {"minecraft:black_bundle", 990}, + {"minecraft:black_candle", 1321}, + {"minecraft:black_carpet", 491}, + {"minecraft:black_concrete", 600}, + {"minecraft:black_concrete_powder", 616}, + {"minecraft:black_dye", 1019}, + {"minecraft:black_glazed_terracotta", 584}, + {"minecraft:black_shulker_box", 568}, + {"minecraft:black_stained_glass", 516}, + {"minecraft:black_stained_glass_pane", 532}, + {"minecraft:black_terracotta", 472}, + {"minecraft:black_wool", 228}, + {"minecraft:blackstone", 1292}, + {"minecraft:blackstone_slab", 1293}, + {"minecraft:blackstone_stairs", 1294}, + {"minecraft:blackstone_wall", 442}, + {"minecraft:blade_pottery_sherd", 1355}, + {"minecraft:blast_furnace", 1271}, + {"minecraft:blaze_powder", 1062}, + {"minecraft:blaze_rod", 1054}, + {"minecraft:blaze_spawn_egg", 1073}, + {"minecraft:blue_banner", 1207}, + {"minecraft:blue_bed", 1035}, + {"minecraft:blue_bundle", 986}, + {"minecraft:blue_candle", 1317}, + {"minecraft:blue_carpet", 487}, + {"minecraft:blue_concrete", 596}, + {"minecraft:blue_concrete_powder", 612}, + {"minecraft:blue_dye", 1015}, + {"minecraft:blue_egg", 970}, + {"minecraft:blue_glazed_terracotta", 580}, + {"minecraft:blue_ice", 649}, + {"minecraft:blue_orchid", 233}, + {"minecraft:blue_shulker_box", 564}, + {"minecraft:blue_stained_glass", 512}, + {"minecraft:blue_stained_glass_pane", 528}, + {"minecraft:blue_terracotta", 468}, + {"minecraft:blue_wool", 224}, + {"minecraft:bogged_spawn_egg", 1074}, + {"minecraft:bolt_armor_trim_smithing_template", 1351}, + {"minecraft:bone", 1021}, + {"minecraft:bone_block", 550}, + {"minecraft:bone_meal", 1020}, + {"minecraft:book", 967}, + {"minecraft:bookshelf", 305}, + {"minecraft:bordure_indented_banner_pattern", 1266}, + {"minecraft:bow", 841}, + {"minecraft:bowl", 839}, + {"minecraft:brain_coral", 630}, + {"minecraft:brain_coral_block", 625}, + {"minecraft:brain_coral_fan", 640}, + {"minecraft:bread", 895}, + {"minecraft:breeze_rod", 1154}, + {"minecraft:breeze_spawn_egg", 1075}, + {"minecraft:brewer_pottery_sherd", 1356}, + {"minecraft:brewing_stand", 1064}, + {"minecraft:brick", 963}, + {"minecraft:brick_slab", 289}, + {"minecraft:brick_stairs", 390}, + {"minecraft:brick_wall", 429}, + {"minecraft:bricks", 304}, + {"minecraft:brown_banner", 1208}, + {"minecraft:brown_bed", 1036}, + {"minecraft:brown_bundle", 987}, + {"minecraft:brown_candle", 1318}, + {"minecraft:brown_carpet", 488}, + {"minecraft:brown_concrete", 597}, + {"minecraft:brown_concrete_powder", 613}, + {"minecraft:brown_dye", 1016}, + {"minecraft:brown_egg", 971}, + {"minecraft:brown_glazed_terracotta", 581}, + {"minecraft:brown_mushroom", 247}, + {"minecraft:brown_mushroom_block", 374}, + {"minecraft:brown_shulker_box", 565}, + {"minecraft:brown_stained_glass", 513}, + {"minecraft:brown_stained_glass_pane", 529}, + {"minecraft:brown_terracotta", 469}, + {"minecraft:brown_wool", 225}, + {"minecraft:brush", 1332}, + {"minecraft:bubble_coral", 631}, + {"minecraft:bubble_coral_block", 626}, + {"minecraft:bubble_coral_fan", 641}, + {"minecraft:bucket", 950}, + {"minecraft:budding_amethyst", 89}, + {"minecraft:bundle", 974}, + {"minecraft:burn_pottery_sherd", 1357}, + {"minecraft:bush", 204}, + {"minecraft:cactus", 328}, + {"minecraft:cactus_flower", 329}, + {"minecraft:cake", 1023}, + {"minecraft:calcite", 11}, + {"minecraft:calibrated_sculk_sensor", 706}, + {"minecraft:camel_spawn_egg", 1077}, + {"minecraft:campfire", 1282}, + {"minecraft:candle", 1305}, + {"minecraft:carrot", 1159}, + {"minecraft:carrot_on_a_stick", 806}, + {"minecraft:cartography_table", 1272}, + {"minecraft:carved_pumpkin", 345}, + {"minecraft:cat_spawn_egg", 1076}, + {"minecraft:cauldron", 1065}, + {"minecraft:cave_spider_spawn_egg", 1078}, + {"minecraft:chain", 378}, + {"minecraft:chain_command_block", 545}, + {"minecraft:chainmail_boots", 903}, + {"minecraft:chainmail_chestplate", 901}, + {"minecraft:chainmail_helmet", 900}, + {"minecraft:chainmail_leggings", 902}, + {"minecraft:charcoal", 844}, + {"minecraft:cherry_boat", 820}, + {"minecraft:cherry_button", 719}, + {"minecraft:cherry_chest_boat", 821}, + {"minecraft:cherry_door", 748}, + {"minecraft:cherry_fence", 337}, + {"minecraft:cherry_fence_gate", 789}, + {"minecraft:cherry_hanging_sign", 943}, + {"minecraft:cherry_leaves", 187}, + {"minecraft:cherry_log", 139}, + {"minecraft:cherry_planks", 41}, + {"minecraft:cherry_pressure_plate", 735}, + {"minecraft:cherry_sapling", 54}, + {"minecraft:cherry_sign", 931}, + {"minecraft:cherry_slab", 275}, + {"minecraft:cherry_stairs", 417}, + {"minecraft:cherry_trapdoor", 769}, + {"minecraft:cherry_wood", 176}, + {"minecraft:chest", 319}, + {"minecraft:chest_minecart", 802}, + {"minecraft:chicken", 1050}, + {"minecraft:chicken_spawn_egg", 1079}, + {"minecraft:chipped_anvil", 450}, + {"minecraft:chiseled_bookshelf", 306}, + {"minecraft:chiseled_copper", 98}, + {"minecraft:chiseled_deepslate", 372}, + {"minecraft:chiseled_nether_bricks", 397}, + {"minecraft:chiseled_polished_blackstone", 1299}, + {"minecraft:chiseled_quartz_block", 452}, + {"minecraft:chiseled_red_sandstone", 541}, + {"minecraft:chiseled_resin_bricks", 389}, + {"minecraft:chiseled_sandstone", 199}, + {"minecraft:chiseled_stone_bricks", 365}, + {"minecraft:chiseled_tuff", 16}, + {"minecraft:chiseled_tuff_bricks", 25}, + {"minecraft:chorus_flower", 313}, + {"minecraft:chorus_fruit", 1213}, + {"minecraft:chorus_plant", 312}, + {"minecraft:clay", 330}, + {"minecraft:clay_ball", 964}, + {"minecraft:clock", 992}, + {"minecraft:closed_eyeblossom", 231}, + {"minecraft:coal", 843}, + {"minecraft:coal_block", 83}, + {"minecraft:coal_ore", 64}, + {"minecraft:coarse_dirt", 29}, + {"minecraft:coast_armor_trim_smithing_template", 1336}, + {"minecraft:cobbled_deepslate", 9}, + {"minecraft:cobbled_deepslate_slab", 682}, + {"minecraft:cobbled_deepslate_stairs", 665}, + {"minecraft:cobbled_deepslate_wall", 445}, + {"minecraft:cobblestone", 35}, + {"minecraft:cobblestone_slab", 288}, + {"minecraft:cobblestone_stairs", 324}, + {"minecraft:cobblestone_wall", 427}, + {"minecraft:cobweb", 201}, + {"minecraft:cocoa_beans", 1003}, + {"minecraft:cod", 995}, + {"minecraft:cod_bucket", 959}, + {"minecraft:cod_spawn_egg", 1080}, + {"minecraft:command_block", 425}, + {"minecraft:command_block_minecart", 1193}, + {"minecraft:comparator", 691}, + {"minecraft:compass", 972}, + {"minecraft:composter", 1268}, + {"minecraft:conduit", 650}, + {"minecraft:cooked_beef", 1049}, + {"minecraft:cooked_chicken", 1051}, + {"minecraft:cooked_cod", 999}, + {"minecraft:cooked_mutton", 1195}, + {"minecraft:cooked_porkchop", 922}, + {"minecraft:cooked_rabbit", 1182}, + {"minecraft:cooked_salmon", 1000}, + {"minecraft:cookie", 1040}, + {"minecraft:copper_block", 91}, + {"minecraft:copper_bulb", 1383}, + {"minecraft:copper_door", 755}, + {"minecraft:copper_grate", 1375}, + {"minecraft:copper_ingot", 853}, + {"minecraft:copper_ore", 68}, + {"minecraft:copper_trapdoor", 776}, + {"minecraft:cornflower", 241}, + {"minecraft:cow_spawn_egg", 1081}, + {"minecraft:cracked_deepslate_bricks", 369}, + {"minecraft:cracked_deepslate_tiles", 371}, + {"minecraft:cracked_nether_bricks", 396}, + {"minecraft:cracked_polished_blackstone_bricks", 1303}, + {"minecraft:cracked_stone_bricks", 364}, + {"minecraft:crafter", 1041}, + {"minecraft:crafting_table", 320}, + {"minecraft:creaking_heart", 318}, + {"minecraft:creaking_spawn_egg", 1144}, + {"minecraft:creeper_banner_pattern", 1258}, + {"minecraft:creeper_head", 1169}, + {"minecraft:creeper_spawn_egg", 1082}, + {"minecraft:crimson_button", 724}, + {"minecraft:crimson_door", 753}, + {"minecraft:crimson_fence", 342}, + {"minecraft:crimson_fence_gate", 794}, + {"minecraft:crimson_fungus", 249}, + {"minecraft:crimson_hanging_sign", 948}, + {"minecraft:crimson_hyphae", 180}, + {"minecraft:crimson_nylium", 33}, + {"minecraft:crimson_planks", 46}, + {"minecraft:crimson_pressure_plate", 740}, + {"minecraft:crimson_roots", 251}, + {"minecraft:crimson_sign", 936}, + {"minecraft:crimson_slab", 281}, + {"minecraft:crimson_stairs", 423}, + {"minecraft:crimson_stem", 145}, + {"minecraft:crimson_trapdoor", 774}, + {"minecraft:crossbow", 1254}, + {"minecraft:crying_obsidian", 1291}, + {"minecraft:cut_copper", 102}, + {"minecraft:cut_copper_slab", 110}, + {"minecraft:cut_copper_stairs", 106}, + {"minecraft:cut_red_sandstone", 542}, + {"minecraft:cut_red_sandstone_slab", 295}, + {"minecraft:cut_sandstone", 200}, + {"minecraft:cut_sandstone_slab", 286}, + {"minecraft:cyan_banner", 1205}, + {"minecraft:cyan_bed", 1033}, + {"minecraft:cyan_bundle", 984}, + {"minecraft:cyan_candle", 1315}, + {"minecraft:cyan_carpet", 485}, + {"minecraft:cyan_concrete", 594}, + {"minecraft:cyan_concrete_powder", 610}, + {"minecraft:cyan_dye", 1013}, + {"minecraft:cyan_glazed_terracotta", 578}, + {"minecraft:cyan_shulker_box", 562}, + {"minecraft:cyan_stained_glass", 510}, + {"minecraft:cyan_stained_glass_pane", 526}, + {"minecraft:cyan_terracotta", 466}, + {"minecraft:cyan_wool", 222}, + {"minecraft:damaged_anvil", 451}, + {"minecraft:dandelion", 229}, + {"minecraft:danger_pottery_sherd", 1358}, + {"minecraft:dark_oak_boat", 822}, + {"minecraft:dark_oak_button", 720}, + {"minecraft:dark_oak_chest_boat", 823}, + {"minecraft:dark_oak_door", 749}, + {"minecraft:dark_oak_fence", 338}, + {"minecraft:dark_oak_fence_gate", 790}, + {"minecraft:dark_oak_hanging_sign", 944}, + {"minecraft:dark_oak_leaves", 188}, + {"minecraft:dark_oak_log", 141}, + {"minecraft:dark_oak_planks", 42}, + {"minecraft:dark_oak_pressure_plate", 736}, + {"minecraft:dark_oak_sapling", 55}, + {"minecraft:dark_oak_sign", 932}, + {"minecraft:dark_oak_slab", 276}, + {"minecraft:dark_oak_stairs", 418}, + {"minecraft:dark_oak_trapdoor", 770}, + {"minecraft:dark_oak_wood", 178}, + {"minecraft:dark_prismarine", 535}, + {"minecraft:dark_prismarine_slab", 299}, + {"minecraft:dark_prismarine_stairs", 538}, + {"minecraft:daylight_detector", 704}, + {"minecraft:dead_brain_coral", 634}, + {"minecraft:dead_brain_coral_block", 620}, + {"minecraft:dead_brain_coral_fan", 645}, + {"minecraft:dead_bubble_coral", 635}, + {"minecraft:dead_bubble_coral_block", 621}, + {"minecraft:dead_bubble_coral_fan", 646}, + {"minecraft:dead_bush", 207}, + {"minecraft:dead_fire_coral", 636}, + {"minecraft:dead_fire_coral_block", 622}, + {"minecraft:dead_fire_coral_fan", 647}, + {"minecraft:dead_horn_coral", 637}, + {"minecraft:dead_horn_coral_block", 623}, + {"minecraft:dead_horn_coral_fan", 648}, + {"minecraft:dead_tube_coral", 638}, + {"minecraft:dead_tube_coral_block", 619}, + {"minecraft:dead_tube_coral_fan", 644}, + {"minecraft:debug_stick", 1230}, + {"minecraft:decorated_pot", 307}, + {"minecraft:deepslate", 8}, + {"minecraft:deepslate_brick_slab", 684}, + {"minecraft:deepslate_brick_stairs", 667}, + {"minecraft:deepslate_brick_wall", 447}, + {"minecraft:deepslate_bricks", 368}, + {"minecraft:deepslate_coal_ore", 65}, + {"minecraft:deepslate_copper_ore", 69}, + {"minecraft:deepslate_diamond_ore", 79}, + {"minecraft:deepslate_emerald_ore", 75}, + {"minecraft:deepslate_gold_ore", 71}, + {"minecraft:deepslate_iron_ore", 67}, + {"minecraft:deepslate_lapis_ore", 77}, + {"minecraft:deepslate_redstone_ore", 73}, + {"minecraft:deepslate_tile_slab", 685}, + {"minecraft:deepslate_tile_stairs", 668}, + {"minecraft:deepslate_tile_wall", 448}, + {"minecraft:deepslate_tiles", 370}, + {"minecraft:detector_rail", 797}, + {"minecraft:diamond", 845}, + {"minecraft:diamond_axe", 881}, + {"minecraft:diamond_block", 93}, + {"minecraft:diamond_boots", 911}, + {"minecraft:diamond_chestplate", 909}, + {"minecraft:diamond_helmet", 908}, + {"minecraft:diamond_hoe", 882}, + {"minecraft:diamond_horse_armor", 1189}, + {"minecraft:diamond_leggings", 910}, + {"minecraft:diamond_ore", 78}, + {"minecraft:diamond_pickaxe", 880}, + {"minecraft:diamond_shovel", 879}, + {"minecraft:diamond_sword", 878}, + {"minecraft:diorite", 4}, + {"minecraft:diorite_slab", 681}, + {"minecraft:diorite_stairs", 664}, + {"minecraft:diorite_wall", 441}, + {"minecraft:dirt", 28}, + {"minecraft:dirt_path", 494}, + {"minecraft:disc_fragment_5", 1250}, + {"minecraft:dispenser", 698}, + {"minecraft:dolphin_spawn_egg", 1083}, + {"minecraft:donkey_spawn_egg", 1084}, + {"minecraft:dragon_breath", 1220}, + {"minecraft:dragon_egg", 408}, + {"minecraft:dragon_head", 1170}, + {"minecraft:dried_kelp", 1045}, + {"minecraft:dried_kelp_block", 965}, + {"minecraft:dripstone_block", 26}, + {"minecraft:dropper", 699}, + {"minecraft:drowned_spawn_egg", 1085}, + {"minecraft:dune_armor_trim_smithing_template", 1335}, + {"minecraft:echo_shard", 1331}, + {"minecraft:egg", 969}, + {"minecraft:elder_guardian_spawn_egg", 1086}, + {"minecraft:elytra", 809}, + {"minecraft:emerald", 846}, + {"minecraft:emerald_block", 411}, + {"minecraft:emerald_ore", 74}, + {"minecraft:enchanted_book", 1176}, + {"minecraft:enchanted_golden_apple", 925}, + {"minecraft:enchanting_table", 404}, + {"minecraft:end_crystal", 1212}, + {"minecraft:end_portal_frame", 405}, + {"minecraft:end_rod", 311}, + {"minecraft:end_stone", 406}, + {"minecraft:end_stone_brick_slab", 674}, + {"minecraft:end_stone_brick_stairs", 656}, + {"minecraft:end_stone_brick_wall", 440}, + {"minecraft:end_stone_bricks", 407}, + {"minecraft:ender_chest", 410}, + {"minecraft:ender_dragon_spawn_egg", 1087}, + {"minecraft:ender_eye", 1066}, + {"minecraft:ender_pearl", 1053}, + {"minecraft:enderman_spawn_egg", 1088}, + {"minecraft:endermite_spawn_egg", 1089}, + {"minecraft:evoker_spawn_egg", 1090}, + {"minecraft:experience_bottle", 1149}, + {"minecraft:explorer_pottery_sherd", 1359}, + {"minecraft:exposed_chiseled_copper", 99}, + {"minecraft:exposed_copper", 95}, + {"minecraft:exposed_copper_bulb", 1384}, + {"minecraft:exposed_copper_door", 756}, + {"minecraft:exposed_copper_grate", 1376}, + {"minecraft:exposed_copper_trapdoor", 777}, + {"minecraft:exposed_cut_copper", 103}, + {"minecraft:exposed_cut_copper_slab", 111}, + {"minecraft:exposed_cut_copper_stairs", 107}, + {"minecraft:eye_armor_trim_smithing_template", 1339}, + {"minecraft:farmland", 321}, + {"minecraft:feather", 891}, + {"minecraft:fermented_spider_eye", 1061}, + {"minecraft:fern", 203}, + {"minecraft:field_masoned_banner_pattern", 1265}, + {"minecraft:filled_map", 1042}, + {"minecraft:fire_charge", 1150}, + {"minecraft:fire_coral", 632}, + {"minecraft:fire_coral_block", 627}, + {"minecraft:fire_coral_fan", 642}, + {"minecraft:firefly_bush", 208}, + {"minecraft:firework_rocket", 1174}, + {"minecraft:firework_star", 1175}, + {"minecraft:fishing_rod", 991}, + {"minecraft:fletching_table", 1273}, + {"minecraft:flint", 920}, + {"minecraft:flint_and_steel", 838}, + {"minecraft:flow_armor_trim_smithing_template", 1350}, + {"minecraft:flow_banner_pattern", 1263}, + {"minecraft:flow_pottery_sherd", 1360}, + {"minecraft:flower_banner_pattern", 1257}, + {"minecraft:flower_pot", 1158}, + {"minecraft:flowering_azalea", 206}, + {"minecraft:flowering_azalea_leaves", 192}, + {"minecraft:fox_spawn_egg", 1091}, + {"minecraft:friend_pottery_sherd", 1361}, + {"minecraft:frog_spawn_egg", 1092}, + {"minecraft:frogspawn", 1330}, + {"minecraft:furnace", 322}, + {"minecraft:furnace_minecart", 803}, + {"minecraft:ghast_spawn_egg", 1093}, + {"minecraft:ghast_tear", 1055}, + {"minecraft:gilded_blackstone", 1295}, + {"minecraft:glass", 195}, + {"minecraft:glass_bottle", 1058}, + {"minecraft:glass_pane", 379}, + {"minecraft:glistering_melon_slice", 1067}, + {"minecraft:globe_banner_pattern", 1261}, + {"minecraft:glow_berries", 1281}, + {"minecraft:glow_ink_sac", 1002}, + {"minecraft:glow_item_frame", 1157}, + {"minecraft:glow_lichen", 382}, + {"minecraft:glow_squid_spawn_egg", 1094}, + {"minecraft:glowstone", 354}, + {"minecraft:glowstone_dust", 994}, + {"minecraft:goat_horn", 1267}, + {"minecraft:goat_spawn_egg", 1095}, + {"minecraft:gold_block", 92}, + {"minecraft:gold_ingot", 855}, + {"minecraft:gold_nugget", 1056}, + {"minecraft:gold_ore", 70}, + {"minecraft:golden_apple", 924}, + {"minecraft:golden_axe", 871}, + {"minecraft:golden_boots", 915}, + {"minecraft:golden_carrot", 1164}, + {"minecraft:golden_chestplate", 913}, + {"minecraft:golden_helmet", 912}, + {"minecraft:golden_hoe", 872}, + {"minecraft:golden_horse_armor", 1188}, + {"minecraft:golden_leggings", 914}, + {"minecraft:golden_pickaxe", 870}, + {"minecraft:golden_shovel", 869}, + {"minecraft:golden_sword", 868}, + {"minecraft:granite", 2}, + {"minecraft:granite_slab", 677}, + {"minecraft:granite_stairs", 660}, + {"minecraft:granite_wall", 433}, + {"minecraft:grass_block", 27}, + {"minecraft:gravel", 63}, + {"minecraft:gray_banner", 1203}, + {"minecraft:gray_bed", 1031}, + {"minecraft:gray_bundle", 982}, + {"minecraft:gray_candle", 1313}, + {"minecraft:gray_carpet", 483}, + {"minecraft:gray_concrete", 592}, + {"minecraft:gray_concrete_powder", 608}, + {"minecraft:gray_dye", 1011}, + {"minecraft:gray_glazed_terracotta", 576}, + {"minecraft:gray_shulker_box", 560}, + {"minecraft:gray_stained_glass", 508}, + {"minecraft:gray_stained_glass_pane", 524}, + {"minecraft:gray_terracotta", 464}, + {"minecraft:gray_wool", 220}, + {"minecraft:green_banner", 1209}, + {"minecraft:green_bed", 1037}, + {"minecraft:green_bundle", 988}, + {"minecraft:green_candle", 1319}, + {"minecraft:green_carpet", 489}, + {"minecraft:green_concrete", 598}, + {"minecraft:green_concrete_powder", 614}, + {"minecraft:green_dye", 1017}, + {"minecraft:green_glazed_terracotta", 582}, + {"minecraft:green_shulker_box", 566}, + {"minecraft:green_stained_glass", 514}, + {"minecraft:green_stained_glass_pane", 530}, + {"minecraft:green_terracotta", 470}, + {"minecraft:green_wool", 226}, + {"minecraft:grindstone", 1274}, + {"minecraft:guardian_spawn_egg", 1096}, + {"minecraft:gunpowder", 892}, + {"minecraft:guster_banner_pattern", 1264}, + {"minecraft:guster_pottery_sherd", 1362}, + {"minecraft:hanging_roots", 266}, + {"minecraft:hay_block", 475}, + {"minecraft:heart_of_the_sea", 1253}, + {"minecraft:heart_pottery_sherd", 1363}, + {"minecraft:heartbreak_pottery_sherd", 1364}, + {"minecraft:heavy_core", 87}, + {"minecraft:heavy_weighted_pressure_plate", 729}, + {"minecraft:hoglin_spawn_egg", 1097}, + {"minecraft:honey_block", 695}, + {"minecraft:honey_bottle", 1288}, + {"minecraft:honeycomb", 1285}, + {"minecraft:honeycomb_block", 1289}, + {"minecraft:hopper", 697}, + {"minecraft:hopper_minecart", 805}, + {"minecraft:horn_coral", 633}, + {"minecraft:horn_coral_block", 628}, + {"minecraft:horn_coral_fan", 643}, + {"minecraft:horse_spawn_egg", 1098}, + {"minecraft:host_armor_trim_smithing_template", 1349}, + {"minecraft:howl_pottery_sherd", 1365}, + {"minecraft:husk_spawn_egg", 1099}, + {"minecraft:ice", 326}, + {"minecraft:infested_chiseled_stone_bricks", 360}, + {"minecraft:infested_cobblestone", 356}, + {"minecraft:infested_cracked_stone_bricks", 359}, + {"minecraft:infested_deepslate", 361}, + {"minecraft:infested_mossy_stone_bricks", 358}, + {"minecraft:infested_stone", 355}, + {"minecraft:infested_stone_bricks", 357}, + {"minecraft:ink_sac", 1001}, + {"minecraft:iron_axe", 876}, + {"minecraft:iron_bars", 377}, + {"minecraft:iron_block", 90}, + {"minecraft:iron_boots", 907}, + {"minecraft:iron_chestplate", 905}, + {"minecraft:iron_door", 742}, + {"minecraft:iron_golem_spawn_egg", 1100}, + {"minecraft:iron_helmet", 904}, + {"minecraft:iron_hoe", 877}, + {"minecraft:iron_horse_armor", 1187}, + {"minecraft:iron_ingot", 851}, + {"minecraft:iron_leggings", 906}, + {"minecraft:iron_nugget", 1228}, + {"minecraft:iron_ore", 66}, + {"minecraft:iron_pickaxe", 875}, + {"minecraft:iron_shovel", 874}, + {"minecraft:iron_sword", 873}, + {"minecraft:iron_trapdoor", 763}, + {"minecraft:item_frame", 1156}, + {"minecraft:jack_o_lantern", 346}, + {"minecraft:jigsaw", 831}, + {"minecraft:jukebox", 331}, + {"minecraft:jungle_boat", 816}, + {"minecraft:jungle_button", 717}, + {"minecraft:jungle_chest_boat", 817}, + {"minecraft:jungle_door", 746}, + {"minecraft:jungle_fence", 335}, + {"minecraft:jungle_fence_gate", 787}, + {"minecraft:jungle_hanging_sign", 941}, + {"minecraft:jungle_leaves", 185}, + {"minecraft:jungle_log", 137}, + {"minecraft:jungle_planks", 39}, + {"minecraft:jungle_pressure_plate", 733}, + {"minecraft:jungle_sapling", 52}, + {"minecraft:jungle_sign", 929}, + {"minecraft:jungle_slab", 273}, + {"minecraft:jungle_stairs", 415}, + {"minecraft:jungle_trapdoor", 767}, + {"minecraft:jungle_wood", 174}, + {"minecraft:kelp", 257}, + {"minecraft:knowledge_book", 1229}, + {"minecraft:ladder", 323}, + {"minecraft:lantern", 1278}, + {"minecraft:lapis_block", 197}, + {"minecraft:lapis_lazuli", 847}, + {"minecraft:lapis_ore", 76}, + {"minecraft:large_amethyst_bud", 1324}, + {"minecraft:large_fern", 500}, + {"minecraft:lava_bucket", 952}, + {"minecraft:lead", 1191}, + {"minecraft:leaf_litter", 260}, + {"minecraft:leather", 955}, + {"minecraft:leather_boots", 899}, + {"minecraft:leather_chestplate", 897}, + {"minecraft:leather_helmet", 896}, + {"minecraft:leather_horse_armor", 1190}, + {"minecraft:leather_leggings", 898}, + {"minecraft:lectern", 700}, + {"minecraft:lever", 702}, + {"minecraft:light", 474}, + {"minecraft:light_blue_banner", 1199}, + {"minecraft:light_blue_bed", 1027}, + {"minecraft:light_blue_bundle", 978}, + {"minecraft:light_blue_candle", 1309}, + {"minecraft:light_blue_carpet", 479}, + {"minecraft:light_blue_concrete", 588}, + {"minecraft:light_blue_concrete_powder", 604}, + {"minecraft:light_blue_dye", 1007}, + {"minecraft:light_blue_glazed_terracotta", 572}, + {"minecraft:light_blue_shulker_box", 556}, + {"minecraft:light_blue_stained_glass", 504}, + {"minecraft:light_blue_stained_glass_pane", 520}, + {"minecraft:light_blue_terracotta", 460}, + {"minecraft:light_blue_wool", 216}, + {"minecraft:light_gray_banner", 1204}, + {"minecraft:light_gray_bed", 1032}, + {"minecraft:light_gray_bundle", 983}, + {"minecraft:light_gray_candle", 1314}, + {"minecraft:light_gray_carpet", 484}, + {"minecraft:light_gray_concrete", 593}, + {"minecraft:light_gray_concrete_powder", 609}, + {"minecraft:light_gray_dye", 1012}, + {"minecraft:light_gray_glazed_terracotta", 577}, + {"minecraft:light_gray_shulker_box", 561}, + {"minecraft:light_gray_stained_glass", 509}, + {"minecraft:light_gray_stained_glass_pane", 525}, + {"minecraft:light_gray_terracotta", 465}, + {"minecraft:light_gray_wool", 221}, + {"minecraft:light_weighted_pressure_plate", 728}, + {"minecraft:lightning_rod", 703}, + {"minecraft:lilac", 496}, + {"minecraft:lily_of_the_valley", 242}, + {"minecraft:lily_pad", 394}, + {"minecraft:lime_banner", 1201}, + {"minecraft:lime_bed", 1029}, + {"minecraft:lime_bundle", 980}, + {"minecraft:lime_candle", 1311}, + {"minecraft:lime_carpet", 481}, + {"minecraft:lime_concrete", 590}, + {"minecraft:lime_concrete_powder", 606}, + {"minecraft:lime_dye", 1009}, + {"minecraft:lime_glazed_terracotta", 574}, + {"minecraft:lime_shulker_box", 558}, + {"minecraft:lime_stained_glass", 506}, + {"minecraft:lime_stained_glass_pane", 522}, + {"minecraft:lime_terracotta", 462}, + {"minecraft:lime_wool", 218}, + {"minecraft:lingering_potion", 1224}, + {"minecraft:llama_spawn_egg", 1101}, + {"minecraft:lodestone", 1290}, + {"minecraft:loom", 1256}, + {"minecraft:mace", 1155}, + {"minecraft:magenta_banner", 1198}, + {"minecraft:magenta_bed", 1026}, + {"minecraft:magenta_bundle", 977}, + {"minecraft:magenta_candle", 1308}, + {"minecraft:magenta_carpet", 478}, + {"minecraft:magenta_concrete", 587}, + {"minecraft:magenta_concrete_powder", 603}, + {"minecraft:magenta_dye", 1006}, + {"minecraft:magenta_glazed_terracotta", 571}, + {"minecraft:magenta_shulker_box", 555}, + {"minecraft:magenta_stained_glass", 503}, + {"minecraft:magenta_stained_glass_pane", 519}, + {"minecraft:magenta_terracotta", 459}, + {"minecraft:magenta_wool", 215}, + {"minecraft:magma_block", 546}, + {"minecraft:magma_cream", 1063}, + {"minecraft:magma_cube_spawn_egg", 1102}, + {"minecraft:mangrove_boat", 826}, + {"minecraft:mangrove_button", 722}, + {"minecraft:mangrove_chest_boat", 827}, + {"minecraft:mangrove_door", 751}, + {"minecraft:mangrove_fence", 340}, + {"minecraft:mangrove_fence_gate", 792}, + {"minecraft:mangrove_hanging_sign", 946}, + {"minecraft:mangrove_leaves", 190}, + {"minecraft:mangrove_log", 142}, + {"minecraft:mangrove_planks", 44}, + {"minecraft:mangrove_pressure_plate", 738}, + {"minecraft:mangrove_propagule", 57}, + {"minecraft:mangrove_roots", 143}, + {"minecraft:mangrove_sign", 934}, + {"minecraft:mangrove_slab", 278}, + {"minecraft:mangrove_stairs", 420}, + {"minecraft:mangrove_trapdoor", 772}, + {"minecraft:mangrove_wood", 179}, + {"minecraft:map", 1163}, + {"minecraft:medium_amethyst_bud", 1323}, + {"minecraft:melon", 380}, + {"minecraft:melon_seeds", 1047}, + {"minecraft:melon_slice", 1044}, + {"minecraft:milk_bucket", 956}, + {"minecraft:minecart", 801}, + {"minecraft:miner_pottery_sherd", 1366}, + {"minecraft:mojang_banner_pattern", 1260}, + {"minecraft:mooshroom_spawn_egg", 1103}, + {"minecraft:moss_block", 262}, + {"minecraft:moss_carpet", 261}, + {"minecraft:mossy_cobblestone", 308}, + {"minecraft:mossy_cobblestone_slab", 673}, + {"minecraft:mossy_cobblestone_stairs", 655}, + {"minecraft:mossy_cobblestone_wall", 428}, + {"minecraft:mossy_stone_brick_slab", 671}, + {"minecraft:mossy_stone_brick_stairs", 653}, + {"minecraft:mossy_stone_brick_wall", 432}, + {"minecraft:mossy_stone_bricks", 363}, + {"minecraft:mourner_pottery_sherd", 1367}, + {"minecraft:mud", 32}, + {"minecraft:mud_brick_slab", 291}, + {"minecraft:mud_brick_stairs", 392}, + {"minecraft:mud_brick_wall", 435}, + {"minecraft:mud_bricks", 367}, + {"minecraft:muddy_mangrove_roots", 144}, + {"minecraft:mule_spawn_egg", 1104}, + {"minecraft:mushroom_stem", 376}, + {"minecraft:mushroom_stew", 889}, + {"minecraft:music_disc_11", 1243}, + {"minecraft:music_disc_13", 1231}, + {"minecraft:music_disc_5", 1247}, + {"minecraft:music_disc_blocks", 1233}, + {"minecraft:music_disc_cat", 1232}, + {"minecraft:music_disc_chirp", 1234}, + {"minecraft:music_disc_creator", 1235}, + {"minecraft:music_disc_creator_music_box", 1236}, + {"minecraft:music_disc_far", 1237}, + {"minecraft:music_disc_mall", 1238}, + {"minecraft:music_disc_mellohi", 1239}, + {"minecraft:music_disc_otherside", 1245}, + {"minecraft:music_disc_pigstep", 1248}, + {"minecraft:music_disc_precipice", 1249}, + {"minecraft:music_disc_relic", 1246}, + {"minecraft:music_disc_stal", 1240}, + {"minecraft:music_disc_strad", 1241}, + {"minecraft:music_disc_wait", 1244}, + {"minecraft:music_disc_ward", 1242}, + {"minecraft:mutton", 1194}, + {"minecraft:mycelium", 393}, + {"minecraft:name_tag", 1192}, + {"minecraft:nautilus_shell", 1252}, + {"minecraft:nether_brick", 1177}, + {"minecraft:nether_brick_fence", 398}, + {"minecraft:nether_brick_slab", 292}, + {"minecraft:nether_brick_stairs", 399}, + {"minecraft:nether_brick_wall", 436}, + {"minecraft:nether_bricks", 395}, + {"minecraft:nether_gold_ore", 80}, + {"minecraft:nether_quartz_ore", 81}, + {"minecraft:nether_sprouts", 253}, + {"minecraft:nether_star", 1172}, + {"minecraft:nether_wart", 1057}, + {"minecraft:nether_wart_block", 547}, + {"minecraft:netherite_axe", 886}, + {"minecraft:netherite_block", 94}, + {"minecraft:netherite_boots", 919}, + {"minecraft:netherite_chestplate", 917}, + {"minecraft:netherite_helmet", 916}, + {"minecraft:netherite_hoe", 887}, + {"minecraft:netherite_ingot", 856}, + {"minecraft:netherite_leggings", 918}, + {"minecraft:netherite_pickaxe", 885}, + {"minecraft:netherite_scrap", 857}, + {"minecraft:netherite_shovel", 884}, + {"minecraft:netherite_sword", 883}, + {"minecraft:netherite_upgrade_smithing_template", 1333}, + {"minecraft:netherrack", 347}, + {"minecraft:note_block", 711}, + {"minecraft:oak_boat", 810}, + {"minecraft:oak_button", 714}, + {"minecraft:oak_chest_boat", 811}, + {"minecraft:oak_door", 743}, + {"minecraft:oak_fence", 332}, + {"minecraft:oak_fence_gate", 784}, + {"minecraft:oak_hanging_sign", 938}, + {"minecraft:oak_leaves", 182}, + {"minecraft:oak_log", 134}, + {"minecraft:oak_planks", 36}, + {"minecraft:oak_pressure_plate", 730}, + {"minecraft:oak_sapling", 49}, + {"minecraft:oak_sign", 926}, + {"minecraft:oak_slab", 270}, + {"minecraft:oak_stairs", 412}, + {"minecraft:oak_trapdoor", 764}, + {"minecraft:oak_wood", 171}, + {"minecraft:observer", 696}, + {"minecraft:obsidian", 309}, + {"minecraft:ocelot_spawn_egg", 1105}, + {"minecraft:ochre_froglight", 1327}, + {"minecraft:ominous_bottle", 1395}, + {"minecraft:ominous_trial_key", 1393}, + {"minecraft:open_eyeblossom", 230}, + {"minecraft:orange_banner", 1197}, + {"minecraft:orange_bed", 1025}, + {"minecraft:orange_bundle", 976}, + {"minecraft:orange_candle", 1307}, + {"minecraft:orange_carpet", 477}, + {"minecraft:orange_concrete", 586}, + {"minecraft:orange_concrete_powder", 602}, + {"minecraft:orange_dye", 1005}, + {"minecraft:orange_glazed_terracotta", 570}, + {"minecraft:orange_shulker_box", 554}, + {"minecraft:orange_stained_glass", 502}, + {"minecraft:orange_stained_glass_pane", 518}, + {"minecraft:orange_terracotta", 458}, + {"minecraft:orange_tulip", 237}, + {"minecraft:orange_wool", 214}, + {"minecraft:oxeye_daisy", 240}, + {"minecraft:oxidized_chiseled_copper", 101}, + {"minecraft:oxidized_copper", 97}, + {"minecraft:oxidized_copper_bulb", 1386}, + {"minecraft:oxidized_copper_door", 758}, + {"minecraft:oxidized_copper_grate", 1378}, + {"minecraft:oxidized_copper_trapdoor", 779}, + {"minecraft:oxidized_cut_copper", 105}, + {"minecraft:oxidized_cut_copper_slab", 113}, + {"minecraft:oxidized_cut_copper_stairs", 109}, + {"minecraft:packed_ice", 493}, + {"minecraft:packed_mud", 366}, + {"minecraft:painting", 923}, + {"minecraft:pale_hanging_moss", 264}, + {"minecraft:pale_moss_block", 265}, + {"minecraft:pale_moss_carpet", 263}, + {"minecraft:pale_oak_boat", 824}, + {"minecraft:pale_oak_button", 721}, + {"minecraft:pale_oak_chest_boat", 825}, + {"minecraft:pale_oak_door", 750}, + {"minecraft:pale_oak_fence", 339}, + {"minecraft:pale_oak_fence_gate", 791}, + {"minecraft:pale_oak_hanging_sign", 945}, + {"minecraft:pale_oak_leaves", 189}, + {"minecraft:pale_oak_log", 140}, + {"minecraft:pale_oak_planks", 43}, + {"minecraft:pale_oak_pressure_plate", 737}, + {"minecraft:pale_oak_sapling", 56}, + {"minecraft:pale_oak_sign", 933}, + {"minecraft:pale_oak_slab", 277}, + {"minecraft:pale_oak_stairs", 419}, + {"minecraft:pale_oak_trapdoor", 771}, + {"minecraft:pale_oak_wood", 177}, + {"minecraft:panda_spawn_egg", 1106}, + {"minecraft:paper", 966}, + {"minecraft:parrot_spawn_egg", 1107}, + {"minecraft:pearlescent_froglight", 1329}, + {"minecraft:peony", 498}, + {"minecraft:petrified_oak_slab", 287}, + {"minecraft:phantom_membrane", 808}, + {"minecraft:phantom_spawn_egg", 1108}, + {"minecraft:pig_spawn_egg", 1109}, + {"minecraft:piglin_banner_pattern", 1262}, + {"minecraft:piglin_brute_spawn_egg", 1111}, + {"minecraft:piglin_head", 1171}, + {"minecraft:piglin_spawn_egg", 1110}, + {"minecraft:pillager_spawn_egg", 1112}, + {"minecraft:pink_banner", 1202}, + {"minecraft:pink_bed", 1030}, + {"minecraft:pink_bundle", 981}, + {"minecraft:pink_candle", 1312}, + {"minecraft:pink_carpet", 482}, + {"minecraft:pink_concrete", 591}, + {"minecraft:pink_concrete_powder", 607}, + {"minecraft:pink_dye", 1010}, + {"minecraft:pink_glazed_terracotta", 575}, + {"minecraft:pink_petals", 258}, + {"minecraft:pink_shulker_box", 559}, + {"minecraft:pink_stained_glass", 507}, + {"minecraft:pink_stained_glass_pane", 523}, + {"minecraft:pink_terracotta", 463}, + {"minecraft:pink_tulip", 239}, + {"minecraft:pink_wool", 219}, + {"minecraft:piston", 692}, + {"minecraft:pitcher_plant", 245}, + {"minecraft:pitcher_pod", 1216}, + {"minecraft:player_head", 1167}, + {"minecraft:plenty_pottery_sherd", 1368}, + {"minecraft:podzol", 30}, + {"minecraft:pointed_dripstone", 1326}, + {"minecraft:poisonous_potato", 1162}, + {"minecraft:polar_bear_spawn_egg", 1113}, + {"minecraft:polished_andesite", 7}, + {"minecraft:polished_andesite_slab", 680}, + {"minecraft:polished_andesite_stairs", 663}, + {"minecraft:polished_basalt", 351}, + {"minecraft:polished_blackstone", 1296}, + {"minecraft:polished_blackstone_brick_slab", 1301}, + {"minecraft:polished_blackstone_brick_stairs", 1302}, + {"minecraft:polished_blackstone_brick_wall", 444}, + {"minecraft:polished_blackstone_bricks", 1300}, + {"minecraft:polished_blackstone_button", 713}, + {"minecraft:polished_blackstone_pressure_plate", 727}, + {"minecraft:polished_blackstone_slab", 1297}, + {"minecraft:polished_blackstone_stairs", 1298}, + {"minecraft:polished_blackstone_wall", 443}, + {"minecraft:polished_deepslate", 10}, + {"minecraft:polished_deepslate_slab", 683}, + {"minecraft:polished_deepslate_stairs", 666}, + {"minecraft:polished_deepslate_wall", 446}, + {"minecraft:polished_diorite", 5}, + {"minecraft:polished_diorite_slab", 672}, + {"minecraft:polished_diorite_stairs", 654}, + {"minecraft:polished_granite", 3}, + {"minecraft:polished_granite_slab", 669}, + {"minecraft:polished_granite_stairs", 651}, + {"minecraft:polished_tuff", 17}, + {"minecraft:polished_tuff_slab", 18}, + {"minecraft:polished_tuff_stairs", 19}, + {"minecraft:polished_tuff_wall", 20}, + {"minecraft:popped_chorus_fruit", 1214}, + {"minecraft:poppy", 232}, + {"minecraft:porkchop", 921}, + {"minecraft:potato", 1160}, + {"minecraft:potion", 1059}, + {"minecraft:powder_snow_bucket", 953}, + {"minecraft:powered_rail", 796}, + {"minecraft:prismarine", 533}, + {"minecraft:prismarine_brick_slab", 298}, + {"minecraft:prismarine_brick_stairs", 537}, + {"minecraft:prismarine_bricks", 534}, + {"minecraft:prismarine_crystals", 1180}, + {"minecraft:prismarine_shard", 1179}, + {"minecraft:prismarine_slab", 297}, + {"minecraft:prismarine_stairs", 536}, + {"minecraft:prismarine_wall", 430}, + {"minecraft:prize_pottery_sherd", 1369}, + {"minecraft:pufferfish", 998}, + {"minecraft:pufferfish_bucket", 957}, + {"minecraft:pufferfish_spawn_egg", 1114}, + {"minecraft:pumpkin", 344}, + {"minecraft:pumpkin_pie", 1173}, + {"minecraft:pumpkin_seeds", 1046}, + {"minecraft:purple_banner", 1206}, + {"minecraft:purple_bed", 1034}, + {"minecraft:purple_bundle", 985}, + {"minecraft:purple_candle", 1316}, + {"minecraft:purple_carpet", 486}, + {"minecraft:purple_concrete", 595}, + {"minecraft:purple_concrete_powder", 611}, + {"minecraft:purple_dye", 1014}, + {"minecraft:purple_glazed_terracotta", 579}, + {"minecraft:purple_shulker_box", 563}, + {"minecraft:purple_stained_glass", 511}, + {"minecraft:purple_stained_glass_pane", 527}, + {"minecraft:purple_terracotta", 467}, + {"minecraft:purple_wool", 223}, + {"minecraft:purpur_block", 314}, + {"minecraft:purpur_pillar", 315}, + {"minecraft:purpur_slab", 296}, + {"minecraft:purpur_stairs", 316}, + {"minecraft:quartz", 848}, + {"minecraft:quartz_block", 453}, + {"minecraft:quartz_bricks", 454}, + {"minecraft:quartz_pillar", 455}, + {"minecraft:quartz_slab", 293}, + {"minecraft:quartz_stairs", 456}, + {"minecraft:rabbit", 1181}, + {"minecraft:rabbit_foot", 1184}, + {"minecraft:rabbit_hide", 1185}, + {"minecraft:rabbit_spawn_egg", 1115}, + {"minecraft:rabbit_stew", 1183}, + {"minecraft:rail", 798}, + {"minecraft:raiser_armor_trim_smithing_template", 1348}, + {"minecraft:ravager_spawn_egg", 1116}, + {"minecraft:raw_copper", 852}, + {"minecraft:raw_copper_block", 85}, + {"minecraft:raw_gold", 854}, + {"minecraft:raw_gold_block", 86}, + {"minecraft:raw_iron", 850}, + {"minecraft:raw_iron_block", 84}, + {"minecraft:recovery_compass", 973}, + {"minecraft:red_banner", 1210}, + {"minecraft:red_bed", 1038}, + {"minecraft:red_bundle", 989}, + {"minecraft:red_candle", 1320}, + {"minecraft:red_carpet", 490}, + {"minecraft:red_concrete", 599}, + {"minecraft:red_concrete_powder", 615}, + {"minecraft:red_dye", 1018}, + {"minecraft:red_glazed_terracotta", 583}, + {"minecraft:red_mushroom", 248}, + {"minecraft:red_mushroom_block", 375}, + {"minecraft:red_nether_brick_slab", 679}, + {"minecraft:red_nether_brick_stairs", 662}, + {"minecraft:red_nether_brick_wall", 438}, + {"minecraft:red_nether_bricks", 549}, + {"minecraft:red_sand", 62}, + {"minecraft:red_sandstone", 540}, + {"minecraft:red_sandstone_slab", 294}, + {"minecraft:red_sandstone_stairs", 543}, + {"minecraft:red_sandstone_wall", 431}, + {"minecraft:red_shulker_box", 567}, + {"minecraft:red_stained_glass", 515}, + {"minecraft:red_stained_glass_pane", 531}, + {"minecraft:red_terracotta", 471}, + {"minecraft:red_tulip", 236}, + {"minecraft:red_wool", 227}, + {"minecraft:redstone", 687}, + {"minecraft:redstone_block", 689}, + {"minecraft:redstone_lamp", 710}, + {"minecraft:redstone_ore", 72}, + {"minecraft:redstone_torch", 688}, + {"minecraft:reinforced_deepslate", 373}, + {"minecraft:repeater", 690}, + {"minecraft:repeating_command_block", 544}, + {"minecraft:resin_block", 384}, + {"minecraft:resin_brick", 1178}, + {"minecraft:resin_brick_slab", 387}, + {"minecraft:resin_brick_stairs", 386}, + {"minecraft:resin_brick_wall", 388}, + {"minecraft:resin_bricks", 385}, + {"minecraft:resin_clump", 383}, + {"minecraft:respawn_anchor", 1304}, + {"minecraft:rib_armor_trim_smithing_template", 1343}, + {"minecraft:rooted_dirt", 31}, + {"minecraft:rose_bush", 497}, + {"minecraft:rotten_flesh", 1052}, + {"minecraft:saddle", 800}, + {"minecraft:salmon", 996}, + {"minecraft:salmon_bucket", 958}, + {"minecraft:salmon_spawn_egg", 1117}, + {"minecraft:sand", 59}, + {"minecraft:sandstone", 198}, + {"minecraft:sandstone_slab", 285}, + {"minecraft:sandstone_stairs", 409}, + {"minecraft:sandstone_wall", 439}, + {"minecraft:scaffolding", 686}, + {"minecraft:scrape_pottery_sherd", 1370}, + {"minecraft:sculk", 400}, + {"minecraft:sculk_catalyst", 402}, + {"minecraft:sculk_sensor", 705}, + {"minecraft:sculk_shrieker", 403}, + {"minecraft:sculk_vein", 401}, + {"minecraft:sea_lantern", 539}, + {"minecraft:sea_pickle", 212}, + {"minecraft:seagrass", 211}, + {"minecraft:sentry_armor_trim_smithing_template", 1334}, + {"minecraft:shaper_armor_trim_smithing_template", 1346}, + {"minecraft:sheaf_pottery_sherd", 1371}, + {"minecraft:shears", 1043}, + {"minecraft:sheep_spawn_egg", 1118}, + {"minecraft:shelter_pottery_sherd", 1372}, + {"minecraft:shield", 1225}, + {"minecraft:short_dry_grass", 209}, + {"minecraft:short_grass", 202}, + {"minecraft:shroomlight", 1284}, + {"minecraft:shulker_box", 552}, + {"minecraft:shulker_shell", 1227}, + {"minecraft:shulker_spawn_egg", 1119}, + {"minecraft:silence_armor_trim_smithing_template", 1347}, + {"minecraft:silverfish_spawn_egg", 1120}, + {"minecraft:skeleton_horse_spawn_egg", 1122}, + {"minecraft:skeleton_skull", 1165}, + {"minecraft:skeleton_spawn_egg", 1121}, + {"minecraft:skull_banner_pattern", 1259}, + {"minecraft:skull_pottery_sherd", 1373}, + {"minecraft:slime_ball", 968}, + {"minecraft:slime_block", 694}, + {"minecraft:slime_spawn_egg", 1123}, + {"minecraft:small_amethyst_bud", 1322}, + {"minecraft:small_dripleaf", 268}, + {"minecraft:smithing_table", 1275}, + {"minecraft:smoker", 1270}, + {"minecraft:smooth_basalt", 352}, + {"minecraft:smooth_quartz", 300}, + {"minecraft:smooth_quartz_slab", 676}, + {"minecraft:smooth_quartz_stairs", 659}, + {"minecraft:smooth_red_sandstone", 301}, + {"minecraft:smooth_red_sandstone_slab", 670}, + {"minecraft:smooth_red_sandstone_stairs", 652}, + {"minecraft:smooth_sandstone", 302}, + {"minecraft:smooth_sandstone_slab", 675}, + {"minecraft:smooth_sandstone_stairs", 658}, + {"minecraft:smooth_stone", 303}, + {"minecraft:smooth_stone_slab", 284}, + {"minecraft:sniffer_egg", 618}, + {"minecraft:sniffer_spawn_egg", 1124}, + {"minecraft:snort_pottery_sherd", 1374}, + {"minecraft:snout_armor_trim_smithing_template", 1342}, + {"minecraft:snow", 325}, + {"minecraft:snow_block", 327}, + {"minecraft:snow_golem_spawn_egg", 1125}, + {"minecraft:snowball", 954}, + {"minecraft:soul_campfire", 1283}, + {"minecraft:soul_lantern", 1279}, + {"minecraft:soul_sand", 348}, + {"minecraft:soul_soil", 349}, + {"minecraft:soul_torch", 353}, + {"minecraft:spawner", 317}, + {"minecraft:spectral_arrow", 1222}, + {"minecraft:spider_eye", 1060}, + {"minecraft:spider_spawn_egg", 1126}, + {"minecraft:spire_armor_trim_smithing_template", 1344}, + {"minecraft:splash_potion", 1221}, + {"minecraft:sponge", 193}, + {"minecraft:spore_blossom", 246}, + {"minecraft:spruce_boat", 812}, + {"minecraft:spruce_button", 715}, + {"minecraft:spruce_chest_boat", 813}, + {"minecraft:spruce_door", 744}, + {"minecraft:spruce_fence", 333}, + {"minecraft:spruce_fence_gate", 785}, + {"minecraft:spruce_hanging_sign", 939}, + {"minecraft:spruce_leaves", 183}, + {"minecraft:spruce_log", 135}, + {"minecraft:spruce_planks", 37}, + {"minecraft:spruce_pressure_plate", 731}, + {"minecraft:spruce_sapling", 50}, + {"minecraft:spruce_sign", 927}, + {"minecraft:spruce_slab", 271}, + {"minecraft:spruce_stairs", 413}, + {"minecraft:spruce_trapdoor", 765}, + {"minecraft:spruce_wood", 172}, + {"minecraft:spyglass", 993}, + {"minecraft:squid_spawn_egg", 1127}, + {"minecraft:stick", 888}, + {"minecraft:sticky_piston", 693}, + {"minecraft:stone", 1}, + {"minecraft:stone_axe", 866}, + {"minecraft:stone_brick_slab", 290}, + {"minecraft:stone_brick_stairs", 391}, + {"minecraft:stone_brick_wall", 434}, + {"minecraft:stone_bricks", 362}, + {"minecraft:stone_button", 712}, + {"minecraft:stone_hoe", 867}, + {"minecraft:stone_pickaxe", 865}, + {"minecraft:stone_pressure_plate", 726}, + {"minecraft:stone_shovel", 864}, + {"minecraft:stone_slab", 283}, + {"minecraft:stone_stairs", 657}, + {"minecraft:stone_sword", 863}, + {"minecraft:stonecutter", 1276}, + {"minecraft:stray_spawn_egg", 1128}, + {"minecraft:strider_spawn_egg", 1129}, + {"minecraft:string", 890}, + {"minecraft:stripped_acacia_log", 152}, + {"minecraft:stripped_acacia_wood", 163}, + {"minecraft:stripped_bamboo_block", 170}, + {"minecraft:stripped_birch_log", 150}, + {"minecraft:stripped_birch_wood", 161}, + {"minecraft:stripped_cherry_log", 153}, + {"minecraft:stripped_cherry_wood", 164}, + {"minecraft:stripped_crimson_hyphae", 168}, + {"minecraft:stripped_crimson_stem", 157}, + {"minecraft:stripped_dark_oak_log", 154}, + {"minecraft:stripped_dark_oak_wood", 165}, + {"minecraft:stripped_jungle_log", 151}, + {"minecraft:stripped_jungle_wood", 162}, + {"minecraft:stripped_mangrove_log", 156}, + {"minecraft:stripped_mangrove_wood", 167}, + {"minecraft:stripped_oak_log", 148}, + {"minecraft:stripped_oak_wood", 159}, + {"minecraft:stripped_pale_oak_log", 155}, + {"minecraft:stripped_pale_oak_wood", 166}, + {"minecraft:stripped_spruce_log", 149}, + {"minecraft:stripped_spruce_wood", 160}, + {"minecraft:stripped_warped_hyphae", 169}, + {"minecraft:stripped_warped_stem", 158}, + {"minecraft:structure_block", 830}, + {"minecraft:structure_void", 551}, + {"minecraft:sugar", 1022}, + {"minecraft:sugar_cane", 256}, + {"minecraft:sunflower", 495}, + {"minecraft:suspicious_gravel", 61}, + {"minecraft:suspicious_sand", 60}, + {"minecraft:suspicious_stew", 1255}, + {"minecraft:sweet_berries", 1280}, + {"minecraft:tadpole_bucket", 962}, + {"minecraft:tadpole_spawn_egg", 1130}, + {"minecraft:tall_dry_grass", 210}, + {"minecraft:tall_grass", 499}, + {"minecraft:target", 701}, + {"minecraft:terracotta", 492}, + {"minecraft:test_block", 832}, + {"minecraft:test_instance_block", 833}, + {"minecraft:tide_armor_trim_smithing_template", 1341}, + {"minecraft:tinted_glass", 196}, + {"minecraft:tipped_arrow", 1223}, + {"minecraft:tnt", 709}, + {"minecraft:tnt_minecart", 804}, + {"minecraft:torch", 310}, + {"minecraft:torchflower", 244}, + {"minecraft:torchflower_seeds", 1215}, + {"minecraft:totem_of_undying", 1226}, + {"minecraft:trader_llama_spawn_egg", 1131}, + {"minecraft:trapped_chest", 708}, + {"minecraft:trial_key", 1392}, + {"minecraft:trial_spawner", 1391}, + {"minecraft:trident", 1251}, + {"minecraft:tripwire_hook", 707}, + {"minecraft:tropical_fish", 997}, + {"minecraft:tropical_fish_bucket", 960}, + {"minecraft:tropical_fish_spawn_egg", 1132}, + {"minecraft:tube_coral", 629}, + {"minecraft:tube_coral_block", 624}, + {"minecraft:tube_coral_fan", 639}, + {"minecraft:tuff", 12}, + {"minecraft:tuff_brick_slab", 22}, + {"minecraft:tuff_brick_stairs", 23}, + {"minecraft:tuff_brick_wall", 24}, + {"minecraft:tuff_bricks", 21}, + {"minecraft:tuff_slab", 13}, + {"minecraft:tuff_stairs", 14}, + {"minecraft:tuff_wall", 15}, + {"minecraft:turtle_egg", 617}, + {"minecraft:turtle_helmet", 834}, + {"minecraft:turtle_scute", 835}, + {"minecraft:turtle_spawn_egg", 1133}, + {"minecraft:twisting_vines", 255}, + {"minecraft:vault", 1394}, + {"minecraft:verdant_froglight", 1328}, + {"minecraft:vex_armor_trim_smithing_template", 1340}, + {"minecraft:vex_spawn_egg", 1134}, + {"minecraft:villager_spawn_egg", 1135}, + {"minecraft:vindicator_spawn_egg", 1136}, + {"minecraft:vine", 381}, + {"minecraft:wandering_trader_spawn_egg", 1137}, + {"minecraft:ward_armor_trim_smithing_template", 1338}, + {"minecraft:warden_spawn_egg", 1138}, + {"minecraft:warped_button", 725}, + {"minecraft:warped_door", 754}, + {"minecraft:warped_fence", 343}, + {"minecraft:warped_fence_gate", 795}, + {"minecraft:warped_fungus", 250}, + {"minecraft:warped_fungus_on_a_stick", 807}, + {"minecraft:warped_hanging_sign", 949}, + {"minecraft:warped_hyphae", 181}, + {"minecraft:warped_nylium", 34}, + {"minecraft:warped_planks", 47}, + {"minecraft:warped_pressure_plate", 741}, + {"minecraft:warped_roots", 252}, + {"minecraft:warped_sign", 937}, + {"minecraft:warped_slab", 282}, + {"minecraft:warped_stairs", 424}, + {"minecraft:warped_stem", 146}, + {"minecraft:warped_trapdoor", 775}, + {"minecraft:warped_wart_block", 548}, + {"minecraft:water_bucket", 951}, + {"minecraft:waxed_chiseled_copper", 118}, + {"minecraft:waxed_copper_block", 114}, + {"minecraft:waxed_copper_bulb", 1387}, + {"minecraft:waxed_copper_door", 759}, + {"minecraft:waxed_copper_grate", 1379}, + {"minecraft:waxed_copper_trapdoor", 780}, + {"minecraft:waxed_cut_copper", 122}, + {"minecraft:waxed_cut_copper_slab", 130}, + {"minecraft:waxed_cut_copper_stairs", 126}, + {"minecraft:waxed_exposed_chiseled_copper", 119}, + {"minecraft:waxed_exposed_copper", 115}, + {"minecraft:waxed_exposed_copper_bulb", 1388}, + {"minecraft:waxed_exposed_copper_door", 760}, + {"minecraft:waxed_exposed_copper_grate", 1380}, + {"minecraft:waxed_exposed_copper_trapdoor", 781}, + {"minecraft:waxed_exposed_cut_copper", 123}, + {"minecraft:waxed_exposed_cut_copper_slab", 131}, + {"minecraft:waxed_exposed_cut_copper_stairs", 127}, + {"minecraft:waxed_oxidized_chiseled_copper", 121}, + {"minecraft:waxed_oxidized_copper", 117}, + {"minecraft:waxed_oxidized_copper_bulb", 1390}, + {"minecraft:waxed_oxidized_copper_door", 762}, + {"minecraft:waxed_oxidized_copper_grate", 1382}, + {"minecraft:waxed_oxidized_copper_trapdoor", 783}, + {"minecraft:waxed_oxidized_cut_copper", 125}, + {"minecraft:waxed_oxidized_cut_copper_slab", 133}, + {"minecraft:waxed_oxidized_cut_copper_stairs", 129}, + {"minecraft:waxed_weathered_chiseled_copper", 120}, + {"minecraft:waxed_weathered_copper", 116}, + {"minecraft:waxed_weathered_copper_bulb", 1389}, + {"minecraft:waxed_weathered_copper_door", 761}, + {"minecraft:waxed_weathered_copper_grate", 1381}, + {"minecraft:waxed_weathered_copper_trapdoor", 782}, + {"minecraft:waxed_weathered_cut_copper", 124}, + {"minecraft:waxed_weathered_cut_copper_slab", 132}, + {"minecraft:waxed_weathered_cut_copper_stairs", 128}, + {"minecraft:wayfinder_armor_trim_smithing_template", 1345}, + {"minecraft:weathered_chiseled_copper", 100}, + {"minecraft:weathered_copper", 96}, + {"minecraft:weathered_copper_bulb", 1385}, + {"minecraft:weathered_copper_door", 757}, + {"minecraft:weathered_copper_grate", 1377}, + {"minecraft:weathered_copper_trapdoor", 778}, + {"minecraft:weathered_cut_copper", 104}, + {"minecraft:weathered_cut_copper_slab", 112}, + {"minecraft:weathered_cut_copper_stairs", 108}, + {"minecraft:weeping_vines", 254}, + {"minecraft:wet_sponge", 194}, + {"minecraft:wheat", 894}, + {"minecraft:wheat_seeds", 893}, + {"minecraft:white_banner", 1196}, + {"minecraft:white_bed", 1024}, + {"minecraft:white_bundle", 975}, + {"minecraft:white_candle", 1306}, + {"minecraft:white_carpet", 476}, + {"minecraft:white_concrete", 585}, + {"minecraft:white_concrete_powder", 601}, + {"minecraft:white_dye", 1004}, + {"minecraft:white_glazed_terracotta", 569}, + {"minecraft:white_shulker_box", 553}, + {"minecraft:white_stained_glass", 501}, + {"minecraft:white_stained_glass_pane", 517}, + {"minecraft:white_terracotta", 457}, + {"minecraft:white_tulip", 238}, + {"minecraft:white_wool", 213}, + {"minecraft:wild_armor_trim_smithing_template", 1337}, + {"minecraft:wildflowers", 259}, + {"minecraft:wind_charge", 1151}, + {"minecraft:witch_spawn_egg", 1139}, + {"minecraft:wither_rose", 243}, + {"minecraft:wither_skeleton_skull", 1166}, + {"minecraft:wither_skeleton_spawn_egg", 1141}, + {"minecraft:wither_spawn_egg", 1140}, + {"minecraft:wolf_armor", 837}, + {"minecraft:wolf_spawn_egg", 1142}, + {"minecraft:wooden_axe", 861}, + {"minecraft:wooden_hoe", 862}, + {"minecraft:wooden_pickaxe", 860}, + {"minecraft:wooden_shovel", 859}, + {"minecraft:wooden_sword", 858}, + {"minecraft:writable_book", 1152}, + {"minecraft:written_book", 1153}, + {"minecraft:yellow_banner", 1200}, + {"minecraft:yellow_bed", 1028}, + {"minecraft:yellow_bundle", 979}, + {"minecraft:yellow_candle", 1310}, + {"minecraft:yellow_carpet", 480}, + {"minecraft:yellow_concrete", 589}, + {"minecraft:yellow_concrete_powder", 605}, + {"minecraft:yellow_dye", 1008}, + {"minecraft:yellow_glazed_terracotta", 573}, + {"minecraft:yellow_shulker_box", 557}, + {"minecraft:yellow_stained_glass", 505}, + {"minecraft:yellow_stained_glass_pane", 521}, + {"minecraft:yellow_terracotta", 461}, + {"minecraft:yellow_wool", 217}, + {"minecraft:zoglin_spawn_egg", 1143}, + {"minecraft:zombie_head", 1168}, + {"minecraft:zombie_horse_spawn_egg", 1146}, + {"minecraft:zombie_spawn_egg", 1145}, + {"minecraft:zombie_villager_spawn_egg", 1147}, + {"minecraft:zombified_piglin_spawn_egg", 1148}, + }}, + {"minecraft:loot_condition_type", + { + {"minecraft:all_of", 2}, + {"minecraft:any_of", 1}, + {"minecraft:block_state_property", 8}, + {"minecraft:damage_source_properties", 12}, + {"minecraft:enchantment_active_check", 18}, + {"minecraft:entity_properties", 5}, + {"minecraft:entity_scores", 7}, + {"minecraft:inverted", 0}, + {"minecraft:killed_by_player", 6}, + {"minecraft:location_check", 13}, + {"minecraft:match_tool", 9}, + {"minecraft:random_chance", 3}, + {"minecraft:random_chance_with_enchanted_bonus", 4}, + {"minecraft:reference", 15}, + {"minecraft:survives_explosion", 11}, + {"minecraft:table_bonus", 10}, + {"minecraft:time_check", 16}, + {"minecraft:value_check", 17}, + {"minecraft:weather_check", 14}, + }}, + {"minecraft:loot_function_type", + { + {"minecraft:apply_bonus", 19}, + {"minecraft:copy_components", 31}, + {"minecraft:copy_custom_data", 24}, + {"minecraft:copy_name", 14}, + {"minecraft:copy_state", 25}, + {"minecraft:enchant_randomly", 3}, + {"minecraft:enchant_with_levels", 2}, + {"minecraft:enchanted_count_increase", 8}, + {"minecraft:exploration_map", 12}, + {"minecraft:explosion_decay", 21}, + {"minecraft:fill_player_head", 23}, + {"minecraft:filtered", 17}, + {"minecraft:furnace_smelt", 7}, + {"minecraft:limit_count", 18}, + {"minecraft:modify_contents", 16}, + {"minecraft:reference", 29}, + {"minecraft:sequence", 30}, + {"minecraft:set_attributes", 10}, + {"minecraft:set_banner_pattern", 26}, + {"minecraft:set_book_cover", 34}, + {"minecraft:set_components", 6}, + {"minecraft:set_contents", 15}, + {"minecraft:set_count", 0}, + {"minecraft:set_custom_data", 5}, + {"minecraft:set_custom_model_data", 39}, + {"minecraft:set_damage", 9}, + {"minecraft:set_enchantments", 4}, + {"minecraft:set_firework_explosion", 33}, + {"minecraft:set_fireworks", 32}, + {"minecraft:set_instrument", 28}, + {"minecraft:set_item", 1}, + {"minecraft:set_loot_table", 20}, + {"minecraft:set_lore", 22}, + {"minecraft:set_name", 11}, + {"minecraft:set_ominous_bottle_amplifier", 38}, + {"minecraft:set_potion", 27}, + {"minecraft:set_stew_effect", 13}, + {"minecraft:set_writable_book_pages", 36}, + {"minecraft:set_written_book_pages", 35}, + {"minecraft:toggle_tooltips", 37}, + }}, + {"minecraft:loot_nbt_provider_type", + { + {"minecraft:context", 1}, + {"minecraft:storage", 0}, + }}, + {"minecraft:loot_number_provider_type", + { + {"minecraft:binomial", 2}, + {"minecraft:constant", 0}, + {"minecraft:enchantment_level", 5}, + {"minecraft:score", 3}, + {"minecraft:storage", 4}, + {"minecraft:uniform", 1}, + }}, + {"minecraft:loot_pool_entry_type", + { + {"minecraft:alternatives", 5}, + {"minecraft:dynamic", 3}, + {"minecraft:empty", 0}, + {"minecraft:group", 7}, + {"minecraft:item", 1}, + {"minecraft:loot_table", 2}, + {"minecraft:sequence", 6}, + {"minecraft:tag", 4}, + }}, + {"minecraft:loot_score_provider_type", + { + {"minecraft:context", 1}, + {"minecraft:fixed", 0}, + }}, + {"minecraft:map_decoration_type", + { + {"minecraft:banner_black", 25}, {"minecraft:banner_blue", 21}, + {"minecraft:banner_brown", 22}, {"minecraft:banner_cyan", 19}, + {"minecraft:banner_gray", 17}, {"minecraft:banner_green", 23}, + {"minecraft:banner_light_blue", 13}, {"minecraft:banner_light_gray", 18}, + {"minecraft:banner_lime", 15}, {"minecraft:banner_magenta", 12}, + {"minecraft:banner_orange", 11}, {"minecraft:banner_pink", 16}, + {"minecraft:banner_purple", 20}, {"minecraft:banner_red", 24}, + {"minecraft:banner_white", 10}, {"minecraft:banner_yellow", 14}, + {"minecraft:blue_marker", 3}, {"minecraft:frame", 1}, + {"minecraft:jungle_temple", 32}, {"minecraft:mansion", 8}, + {"minecraft:monument", 9}, {"minecraft:player", 0}, + {"minecraft:player_off_limits", 7}, {"minecraft:player_off_map", 6}, + {"minecraft:red_marker", 2}, {"minecraft:red_x", 26}, + {"minecraft:swamp_hut", 33}, {"minecraft:target_point", 5}, + {"minecraft:target_x", 4}, {"minecraft:trial_chambers", 34}, + {"minecraft:village_desert", 27}, {"minecraft:village_plains", 28}, + {"minecraft:village_savanna", 29}, {"minecraft:village_snowy", 30}, + {"minecraft:village_taiga", 31}, + }}, + {"minecraft:memory_module_type", + { + {"minecraft:admiring_disabled", 59}, + {"minecraft:admiring_item", 56}, + {"minecraft:angry_at", 54}, + {"minecraft:ate_recently", 74}, + {"minecraft:attack_cooling_down", 16}, + {"minecraft:attack_target", 15}, + {"minecraft:avoid_target", 26}, + {"minecraft:breed_target", 18}, + {"minecraft:breeze_jump_cooldown", 99}, + {"minecraft:breeze_jump_inhaling", 104}, + {"minecraft:breeze_jump_target", 105}, + {"minecraft:breeze_leaving_water", 106}, + {"minecraft:breeze_shoot", 100}, + {"minecraft:breeze_shoot_charging", 101}, + {"minecraft:breeze_shoot_cooldown", 103}, + {"minecraft:breeze_shoot_recover", 102}, + {"minecraft:cant_reach_walk_target_since", 31}, + {"minecraft:celebrate_location", 61}, + {"minecraft:dancing", 62}, + {"minecraft:danger_detected_recently", 33}, + {"minecraft:dig_cooldown", 83}, + {"minecraft:disable_walk_to_admire_item", 58}, + {"minecraft:disturbance_location", 78}, + {"minecraft:doors_to_close", 22}, + {"minecraft:dummy", 0}, + {"minecraft:gaze_cooldown_ticks", 43}, + {"minecraft:golem_detected_recently", 32}, + {"minecraft:has_hunting_cooldown", 47}, + {"minecraft:heard_bell_time", 30}, + {"minecraft:hiding_place", 29}, + {"minecraft:home", 1}, + {"minecraft:hunted_recently", 60}, + {"minecraft:hurt_by", 24}, + {"minecraft:hurt_by_entity", 25}, + {"minecraft:interactable_doors", 21}, + {"minecraft:interaction_target", 17}, + {"minecraft:is_emerging", 81}, + {"minecraft:is_in_water", 50}, + {"minecraft:is_panicking", 52}, + {"minecraft:is_pregnant", 51}, + {"minecraft:is_sniffing", 80}, + {"minecraft:is_tempted", 44}, + {"minecraft:item_pickup_cooldown_ticks", 94}, + {"minecraft:job_site", 2}, + {"minecraft:last_slept", 34}, + {"minecraft:last_woken", 35}, + {"minecraft:last_worked_at_poi", 36}, + {"minecraft:liked_noteblock", 92}, + {"minecraft:liked_noteblock_cooldown_ticks", 93}, + {"minecraft:liked_player", 91}, + {"minecraft:long_jump_cooling_down", 45}, + {"minecraft:long_jump_mid_jump", 46}, + {"minecraft:look_target", 14}, + {"minecraft:meeting_point", 4}, + {"minecraft:mobs", 6}, + {"minecraft:nearby_adult_piglins", 66}, + {"minecraft:nearest_attackable", 28}, + {"minecraft:nearest_bed", 23}, + {"minecraft:nearest_hostile", 27}, + {"minecraft:nearest_player_holding_wanted_item", 73}, + {"minecraft:nearest_players", 9}, + {"minecraft:nearest_repellent", 75}, + {"minecraft:nearest_targetable_player_not_wearing_gold", 65}, + {"minecraft:nearest_visible_adult", 37}, + {"minecraft:nearest_visible_adult_hoglins", 68}, + {"minecraft:nearest_visible_adult_piglin", 69}, + {"minecraft:nearest_visible_adult_piglins", 67}, + {"minecraft:nearest_visible_baby_hoglin", 64}, + {"minecraft:nearest_visible_huntable_hoglin", 63}, + {"minecraft:nearest_visible_nemesis", 39}, + {"minecraft:nearest_visible_player", 10}, + {"minecraft:nearest_visible_targetable_player", 11}, + {"minecraft:nearest_visible_targetable_players", 12}, + {"minecraft:nearest_visible_wanted_item", 38}, + {"minecraft:nearest_visible_zombified", 70}, + {"minecraft:pacified", 76}, + {"minecraft:path", 20}, + {"minecraft:play_dead_ticks", 40}, + {"minecraft:potential_job_site", 3}, + {"minecraft:ram_cooldown_ticks", 48}, + {"minecraft:ram_target", 49}, + {"minecraft:recent_projectile", 79}, + {"minecraft:ride_target", 19}, + {"minecraft:roar_sound_cooldown", 84}, + {"minecraft:roar_sound_delay", 82}, + {"minecraft:roar_target", 77}, + {"minecraft:secondary_job_site", 5}, + {"minecraft:sniff_cooldown", 85}, + {"minecraft:sniffer_digging", 97}, + {"minecraft:sniffer_explored_positions", 95}, + {"minecraft:sniffer_happy", 98}, + {"minecraft:sniffer_sniffing_target", 96}, + {"minecraft:sonic_boom_cooldown", 88}, + {"minecraft:sonic_boom_sound_cooldown", 89}, + {"minecraft:sonic_boom_sound_delay", 90}, + {"minecraft:temptation_cooldown_ticks", 42}, + {"minecraft:tempting_player", 41}, + {"minecraft:time_trying_to_reach_admire_item", 57}, + {"minecraft:touch_cooldown", 86}, + {"minecraft:universal_anger", 55}, + {"minecraft:unreachable_tongue_targets", 53}, + {"minecraft:vibration_cooldown", 87}, + {"minecraft:visible_adult_hoglin_count", 72}, + {"minecraft:visible_adult_piglin_count", 71}, + {"minecraft:visible_mobs", 7}, + {"minecraft:visible_villager_babies", 8}, + {"minecraft:walk_target", 13}, + }}, + {"minecraft:menu", + { + {"minecraft:anvil", 8}, + {"minecraft:beacon", 9}, + {"minecraft:blast_furnace", 10}, + {"minecraft:brewing_stand", 11}, + {"minecraft:cartography_table", 23}, + {"minecraft:crafter_3x3", 7}, + {"minecraft:crafting", 12}, + {"minecraft:enchantment", 13}, + {"minecraft:furnace", 14}, + {"minecraft:generic_3x3", 6}, + {"minecraft:generic_9x1", 0}, + {"minecraft:generic_9x2", 1}, + {"minecraft:generic_9x3", 2}, + {"minecraft:generic_9x4", 3}, + {"minecraft:generic_9x5", 4}, + {"minecraft:generic_9x6", 5}, + {"minecraft:grindstone", 15}, + {"minecraft:hopper", 16}, + {"minecraft:lectern", 17}, + {"minecraft:loom", 18}, + {"minecraft:merchant", 19}, + {"minecraft:shulker_box", 20}, + {"minecraft:smithing", 21}, + {"minecraft:smoker", 22}, + {"minecraft:stonecutter", 24}, + }}, + {"minecraft:mob_effect", + { + {"minecraft:absorption", 21}, + {"minecraft:bad_omen", 30}, + {"minecraft:blindness", 14}, + {"minecraft:conduit_power", 28}, + {"minecraft:darkness", 32}, + {"minecraft:dolphins_grace", 29}, + {"minecraft:fire_resistance", 11}, + {"minecraft:glowing", 23}, + {"minecraft:haste", 2}, + {"minecraft:health_boost", 20}, + {"minecraft:hero_of_the_village", 31}, + {"minecraft:hunger", 16}, + {"minecraft:infested", 38}, + {"minecraft:instant_damage", 6}, + {"minecraft:instant_health", 5}, + {"minecraft:invisibility", 13}, + {"minecraft:jump_boost", 7}, + {"minecraft:levitation", 24}, + {"minecraft:luck", 25}, + {"minecraft:mining_fatigue", 3}, + {"minecraft:nausea", 8}, + {"minecraft:night_vision", 15}, + {"minecraft:oozing", 37}, + {"minecraft:poison", 18}, + {"minecraft:raid_omen", 34}, + {"minecraft:regeneration", 9}, + {"minecraft:resistance", 10}, + {"minecraft:saturation", 22}, + {"minecraft:slow_falling", 27}, + {"minecraft:slowness", 1}, + {"minecraft:speed", 0}, + {"minecraft:strength", 4}, + {"minecraft:trial_omen", 33}, + {"minecraft:unluck", 26}, + {"minecraft:water_breathing", 12}, + {"minecraft:weakness", 17}, + {"minecraft:weaving", 36}, + {"minecraft:wind_charged", 35}, + {"minecraft:wither", 19}, + }}, + {"minecraft:number_format_type", + { + {"minecraft:blank", 0}, + {"minecraft:fixed", 2}, + {"minecraft:styled", 1}, + }}, + {"minecraft:particle_type", + { + {"minecraft:angry_villager", 0}, + {"minecraft:ash", 81}, + {"minecraft:block", 1}, + {"minecraft:block_crumble", 112}, + {"minecraft:block_marker", 2}, + {"minecraft:bubble", 3}, + {"minecraft:bubble_column_up", 71}, + {"minecraft:bubble_pop", 69}, + {"minecraft:campfire_cosy_smoke", 74}, + {"minecraft:campfire_signal_smoke", 75}, + {"minecraft:cherry_leaves", 33}, + {"minecraft:cloud", 4}, + {"minecraft:composter", 43}, + {"minecraft:crimson_spore", 82}, + {"minecraft:crit", 5}, + {"minecraft:current_down", 70}, + {"minecraft:damage_indicator", 6}, + {"minecraft:dolphin", 73}, + {"minecraft:dragon_breath", 7}, + {"minecraft:dripping_dripstone_lava", 92}, + {"minecraft:dripping_dripstone_water", 94}, + {"minecraft:dripping_honey", 76}, + {"minecraft:dripping_lava", 8}, + {"minecraft:dripping_obsidian_tear", 85}, + {"minecraft:dripping_water", 11}, + {"minecraft:dust", 13}, + {"minecraft:dust_color_transition", 14}, + {"minecraft:dust_pillar", 108}, + {"minecraft:dust_plume", 104}, + {"minecraft:effect", 15}, + {"minecraft:egg_crack", 103}, + {"minecraft:elder_guardian", 16}, + {"minecraft:electric_spark", 100}, + {"minecraft:enchant", 18}, + {"minecraft:enchanted_hit", 17}, + {"minecraft:end_rod", 19}, + {"minecraft:entity_effect", 20}, + {"minecraft:explosion", 22}, + {"minecraft:explosion_emitter", 21}, + {"minecraft:falling_dripstone_lava", 93}, + {"minecraft:falling_dripstone_water", 95}, + {"minecraft:falling_dust", 28}, + {"minecraft:falling_honey", 77}, + {"minecraft:falling_lava", 9}, + {"minecraft:falling_nectar", 79}, + {"minecraft:falling_obsidian_tear", 86}, + {"minecraft:falling_spore_blossom", 80}, + {"minecraft:falling_water", 12}, + {"minecraft:firefly", 113}, + {"minecraft:firework", 29}, + {"minecraft:fishing", 30}, + {"minecraft:flame", 31}, + {"minecraft:flash", 41}, + {"minecraft:glow", 97}, + {"minecraft:glow_squid_ink", 96}, + {"minecraft:gust", 23}, + {"minecraft:gust_emitter_large", 25}, + {"minecraft:gust_emitter_small", 26}, + {"minecraft:happy_villager", 42}, + {"minecraft:heart", 44}, + {"minecraft:infested", 32}, + {"minecraft:instant_effect", 45}, + {"minecraft:item", 46}, + {"minecraft:item_cobweb", 50}, + {"minecraft:item_slime", 49}, + {"minecraft:item_snowball", 51}, + {"minecraft:landing_honey", 78}, + {"minecraft:landing_lava", 10}, + {"minecraft:landing_obsidian_tear", 87}, + {"minecraft:large_smoke", 52}, + {"minecraft:lava", 53}, + {"minecraft:mycelium", 54}, + {"minecraft:nautilus", 72}, + {"minecraft:note", 55}, + {"minecraft:ominous_spawning", 109}, + {"minecraft:pale_oak_leaves", 34}, + {"minecraft:poof", 56}, + {"minecraft:portal", 57}, + {"minecraft:raid_omen", 110}, + {"minecraft:rain", 58}, + {"minecraft:reverse_portal", 88}, + {"minecraft:scrape", 101}, + {"minecraft:sculk_charge", 37}, + {"minecraft:sculk_charge_pop", 38}, + {"minecraft:sculk_soul", 36}, + {"minecraft:shriek", 102}, + {"minecraft:small_flame", 90}, + {"minecraft:small_gust", 24}, + {"minecraft:smoke", 59}, + {"minecraft:sneeze", 61}, + {"minecraft:snowflake", 91}, + {"minecraft:sonic_boom", 27}, + {"minecraft:soul", 40}, + {"minecraft:soul_fire_flame", 39}, + {"minecraft:spit", 62}, + {"minecraft:splash", 67}, + {"minecraft:spore_blossom_air", 84}, + {"minecraft:squid_ink", 63}, + {"minecraft:sweep_attack", 64}, + {"minecraft:tinted_leaves", 35}, + {"minecraft:totem_of_undying", 65}, + {"minecraft:trail", 48}, + {"minecraft:trial_omen", 111}, + {"minecraft:trial_spawner_detection", 105}, + {"minecraft:trial_spawner_detection_ominous", 106}, + {"minecraft:underwater", 66}, + {"minecraft:vault_connection", 107}, + {"minecraft:vibration", 47}, + {"minecraft:warped_spore", 83}, + {"minecraft:wax_off", 99}, + {"minecraft:wax_on", 98}, + {"minecraft:white_ash", 89}, + {"minecraft:white_smoke", 60}, + {"minecraft:witch", 68}, + }}, + {"minecraft:point_of_interest_type", + { + {"minecraft:armorer", 0}, {"minecraft:bee_nest", 16}, {"minecraft:beehive", 15}, {"minecraft:butcher", 1}, + {"minecraft:cartographer", 2}, {"minecraft:cleric", 3}, {"minecraft:farmer", 4}, {"minecraft:fisherman", 5}, + {"minecraft:fletcher", 6}, {"minecraft:home", 13}, {"minecraft:leatherworker", 7}, {"minecraft:librarian", 8}, + {"minecraft:lightning_rod", 19}, {"minecraft:lodestone", 18}, {"minecraft:mason", 9}, {"minecraft:meeting", 14}, + {"minecraft:nether_portal", 17}, {"minecraft:shepherd", 10}, {"minecraft:toolsmith", 11}, {"minecraft:weaponsmith", 12}, + }}, + {"minecraft:pos_rule_test", + { + {"minecraft:always_true", 0}, + {"minecraft:axis_aligned_linear_pos", 2}, + {"minecraft:linear_pos", 1}, + }}, + {"minecraft:position_source_type", + { + {"minecraft:block", 0}, + {"minecraft:entity", 1}, + }}, + {"minecraft:potion", + { + {"minecraft:awkward", 3}, + {"minecraft:fire_resistance", 11}, + {"minecraft:harming", 26}, + {"minecraft:healing", 24}, + {"minecraft:infested", 45}, + {"minecraft:invisibility", 6}, + {"minecraft:leaping", 8}, + {"minecraft:long_fire_resistance", 12}, + {"minecraft:long_invisibility", 7}, + {"minecraft:long_leaping", 9}, + {"minecraft:long_night_vision", 5}, + {"minecraft:long_poison", 29}, + {"minecraft:long_regeneration", 32}, + {"minecraft:long_slow_falling", 41}, + {"minecraft:long_slowness", 17}, + {"minecraft:long_strength", 35}, + {"minecraft:long_swiftness", 14}, + {"minecraft:long_turtle_master", 20}, + {"minecraft:long_water_breathing", 23}, + {"minecraft:long_weakness", 38}, + {"minecraft:luck", 39}, + {"minecraft:mundane", 1}, + {"minecraft:night_vision", 4}, + {"minecraft:oozing", 44}, + {"minecraft:poison", 28}, + {"minecraft:regeneration", 31}, + {"minecraft:slow_falling", 40}, + {"minecraft:slowness", 16}, + {"minecraft:strength", 34}, + {"minecraft:strong_harming", 27}, + {"minecraft:strong_healing", 25}, + {"minecraft:strong_leaping", 10}, + {"minecraft:strong_poison", 30}, + {"minecraft:strong_regeneration", 33}, + {"minecraft:strong_slowness", 18}, + {"minecraft:strong_strength", 36}, + {"minecraft:strong_swiftness", 15}, + {"minecraft:strong_turtle_master", 21}, + {"minecraft:swiftness", 13}, + {"minecraft:thick", 2}, + {"minecraft:turtle_master", 19}, + {"minecraft:water", 0}, + {"minecraft:water_breathing", 22}, + {"minecraft:weakness", 37}, + {"minecraft:weaving", 43}, + {"minecraft:wind_charged", 42}, + }}, + {"minecraft:recipe_book_category", + { + {"minecraft:blast_furnace_blocks", 7}, + {"minecraft:blast_furnace_misc", 8}, + {"minecraft:campfire", 12}, + {"minecraft:crafting_building_blocks", 0}, + {"minecraft:crafting_equipment", 2}, + {"minecraft:crafting_misc", 3}, + {"minecraft:crafting_redstone", 1}, + {"minecraft:furnace_blocks", 5}, + {"minecraft:furnace_food", 4}, + {"minecraft:furnace_misc", 6}, + {"minecraft:smithing", 11}, + {"minecraft:smoker_food", 9}, + {"minecraft:stonecutter", 10}, + }}, + {"minecraft:recipe_display", + { + {"minecraft:crafting_shaped", 1}, + {"minecraft:crafting_shapeless", 0}, + {"minecraft:furnace", 2}, + {"minecraft:smithing", 4}, + {"minecraft:stonecutter", 3}, + }}, + {"minecraft:recipe_serializer", + { + {"minecraft:blasting", 15}, + {"minecraft:campfire_cooking", 17}, + {"minecraft:crafting_decorated_pot", 21}, + {"minecraft:crafting_shaped", 0}, + {"minecraft:crafting_shapeless", 1}, + {"minecraft:crafting_special_armordye", 2}, + {"minecraft:crafting_special_bannerduplicate", 10}, + {"minecraft:crafting_special_bookcloning", 3}, + {"minecraft:crafting_special_firework_rocket", 6}, + {"minecraft:crafting_special_firework_star", 7}, + {"minecraft:crafting_special_firework_star_fade", 8}, + {"minecraft:crafting_special_mapcloning", 4}, + {"minecraft:crafting_special_mapextending", 5}, + {"minecraft:crafting_special_repairitem", 13}, + {"minecraft:crafting_special_shielddecoration", 11}, + {"minecraft:crafting_special_tippedarrow", 9}, + {"minecraft:crafting_transmute", 12}, + {"minecraft:smelting", 14}, + {"minecraft:smithing_transform", 19}, + {"minecraft:smithing_trim", 20}, + {"minecraft:smoking", 16}, + {"minecraft:stonecutting", 18}, + }}, + {"minecraft:recipe_type", + { + {"minecraft:blasting", 2}, + {"minecraft:campfire_cooking", 4}, + {"minecraft:crafting", 0}, + {"minecraft:smelting", 1}, + {"minecraft:smithing", 6}, + {"minecraft:smoking", 3}, + {"minecraft:stonecutting", 5}, + }}, + {"minecraft:rule_block_entity_modifier", + { + {"minecraft:append_loot", 3}, + {"minecraft:append_static", 2}, + {"minecraft:clear", 0}, + {"minecraft:passthrough", 1}, + }}, + {"minecraft:rule_test", + { + {"minecraft:always_true", 0}, + {"minecraft:block_match", 1}, + {"minecraft:blockstate_match", 2}, + {"minecraft:random_block_match", 4}, + {"minecraft:random_blockstate_match", 5}, + {"minecraft:tag_match", 3}, + }}, + {"minecraft:schedule", + { + {"minecraft:empty", 0}, + {"minecraft:simple", 1}, + {"minecraft:villager_baby", 2}, + {"minecraft:villager_default", 3}, + }}, + {"minecraft:sensor_type", + { + {"minecraft:armadillo_scare_detected", 10}, + {"minecraft:armadillo_temptations", 20}, + {"minecraft:axolotl_attackables", 15}, + {"minecraft:axolotl_temptations", 16}, + {"minecraft:breeze_attack_entity_sensor", 25}, + {"minecraft:camel_temptations", 19}, + {"minecraft:dummy", 0}, + {"minecraft:frog_attackables", 21}, + {"minecraft:frog_temptations", 18}, + {"minecraft:goat_temptations", 17}, + {"minecraft:golem_detected", 9}, + {"minecraft:hoglin_specific_sensor", 13}, + {"minecraft:hurt_by", 5}, + {"minecraft:is_in_water", 22}, + {"minecraft:nearest_adult", 14}, + {"minecraft:nearest_bed", 4}, + {"minecraft:nearest_items", 1}, + {"minecraft:nearest_living_entities", 2}, + {"minecraft:nearest_players", 3}, + {"minecraft:piglin_brute_specific_sensor", 12}, + {"minecraft:piglin_specific_sensor", 11}, + {"minecraft:secondary_pois", 8}, + {"minecraft:sniffer_temptations", 24}, + {"minecraft:villager_babies", 7}, + {"minecraft:villager_hostiles", 6}, + {"minecraft:warden_entity_sensor", 23}, + }}, + {"minecraft:slot_display", + { + {"minecraft:any_fuel", 1}, + {"minecraft:composite", 7}, + {"minecraft:empty", 0}, + {"minecraft:item", 2}, + {"minecraft:item_stack", 3}, + {"minecraft:smithing_trim", 5}, + {"minecraft:tag", 4}, + {"minecraft:with_remainder", 6}, + }}, + {"minecraft:sound_event", + { + {"minecraft:ambient.basalt_deltas.additions", 8}, + {"minecraft:ambient.basalt_deltas.loop", 9}, + {"minecraft:ambient.basalt_deltas.mood", 10}, + {"minecraft:ambient.cave", 7}, + {"minecraft:ambient.crimson_forest.additions", 11}, + {"minecraft:ambient.crimson_forest.loop", 12}, + {"minecraft:ambient.crimson_forest.mood", 13}, + {"minecraft:ambient.nether_wastes.additions", 14}, + {"minecraft:ambient.nether_wastes.loop", 15}, + {"minecraft:ambient.nether_wastes.mood", 16}, + {"minecraft:ambient.soul_sand_valley.additions", 17}, + {"minecraft:ambient.soul_sand_valley.loop", 18}, + {"minecraft:ambient.soul_sand_valley.mood", 19}, + {"minecraft:ambient.underwater.enter", 23}, + {"minecraft:ambient.underwater.exit", 24}, + {"minecraft:ambient.underwater.loop", 25}, + {"minecraft:ambient.underwater.loop.additions", 26}, + {"minecraft:ambient.underwater.loop.additions.rare", 27}, + {"minecraft:ambient.underwater.loop.additions.ultra_rare", 28}, + {"minecraft:ambient.warped_forest.additions", 20}, + {"minecraft:ambient.warped_forest.loop", 21}, + {"minecraft:ambient.warped_forest.mood", 22}, + {"minecraft:block.amethyst_block.break", 29}, + {"minecraft:block.amethyst_block.chime", 30}, + {"minecraft:block.amethyst_block.fall", 31}, + {"minecraft:block.amethyst_block.hit", 32}, + {"minecraft:block.amethyst_block.place", 33}, + {"minecraft:block.amethyst_block.resonate", 34}, + {"minecraft:block.amethyst_block.step", 35}, + {"minecraft:block.amethyst_cluster.break", 36}, + {"minecraft:block.amethyst_cluster.fall", 37}, + {"minecraft:block.amethyst_cluster.hit", 38}, + {"minecraft:block.amethyst_cluster.place", 39}, + {"minecraft:block.amethyst_cluster.step", 40}, + {"minecraft:block.ancient_debris.break", 41}, + {"minecraft:block.ancient_debris.fall", 45}, + {"minecraft:block.ancient_debris.hit", 44}, + {"minecraft:block.ancient_debris.place", 43}, + {"minecraft:block.ancient_debris.step", 42}, + {"minecraft:block.anvil.break", 46}, + {"minecraft:block.anvil.destroy", 47}, + {"minecraft:block.anvil.fall", 48}, + {"minecraft:block.anvil.hit", 49}, + {"minecraft:block.anvil.land", 50}, + {"minecraft:block.anvil.place", 51}, + {"minecraft:block.anvil.step", 52}, + {"minecraft:block.anvil.use", 53}, + {"minecraft:block.azalea.break", 95}, + {"minecraft:block.azalea.fall", 96}, + {"minecraft:block.azalea.hit", 97}, + {"minecraft:block.azalea.place", 98}, + {"minecraft:block.azalea.step", 99}, + {"minecraft:block.azalea_leaves.break", 100}, + {"minecraft:block.azalea_leaves.fall", 101}, + {"minecraft:block.azalea_leaves.hit", 102}, + {"minecraft:block.azalea_leaves.place", 103}, + {"minecraft:block.azalea_leaves.step", 104}, + {"minecraft:block.bamboo.break", 105}, + {"minecraft:block.bamboo.fall", 106}, + {"minecraft:block.bamboo.hit", 107}, + {"minecraft:block.bamboo.place", 108}, + {"minecraft:block.bamboo.step", 109}, + {"minecraft:block.bamboo_sapling.break", 110}, + {"minecraft:block.bamboo_sapling.hit", 111}, + {"minecraft:block.bamboo_sapling.place", 112}, + {"minecraft:block.bamboo_wood.break", 113}, + {"minecraft:block.bamboo_wood.fall", 114}, + {"minecraft:block.bamboo_wood.hit", 115}, + {"minecraft:block.bamboo_wood.place", 116}, + {"minecraft:block.bamboo_wood.step", 117}, + {"minecraft:block.bamboo_wood_button.click_off", 122}, + {"minecraft:block.bamboo_wood_button.click_on", 123}, + {"minecraft:block.bamboo_wood_door.close", 118}, + {"minecraft:block.bamboo_wood_door.open", 119}, + {"minecraft:block.bamboo_wood_fence_gate.close", 126}, + {"minecraft:block.bamboo_wood_fence_gate.open", 127}, + {"minecraft:block.bamboo_wood_hanging_sign.break", 697}, + {"minecraft:block.bamboo_wood_hanging_sign.fall", 698}, + {"minecraft:block.bamboo_wood_hanging_sign.hit", 699}, + {"minecraft:block.bamboo_wood_hanging_sign.place", 700}, + {"minecraft:block.bamboo_wood_hanging_sign.step", 696}, + {"minecraft:block.bamboo_wood_pressure_plate.click_off", 124}, + {"minecraft:block.bamboo_wood_pressure_plate.click_on", 125}, + {"minecraft:block.bamboo_wood_trapdoor.close", 120}, + {"minecraft:block.bamboo_wood_trapdoor.open", 121}, + {"minecraft:block.barrel.close", 128}, + {"minecraft:block.barrel.open", 129}, + {"minecraft:block.basalt.break", 130}, + {"minecraft:block.basalt.fall", 134}, + {"minecraft:block.basalt.hit", 133}, + {"minecraft:block.basalt.place", 132}, + {"minecraft:block.basalt.step", 131}, + {"minecraft:block.beacon.activate", 140}, + {"minecraft:block.beacon.ambient", 141}, + {"minecraft:block.beacon.deactivate", 142}, + {"minecraft:block.beacon.power_select", 143}, + {"minecraft:block.beehive.drip", 150}, + {"minecraft:block.beehive.enter", 151}, + {"minecraft:block.beehive.exit", 152}, + {"minecraft:block.beehive.shear", 153}, + {"minecraft:block.beehive.work", 154}, + {"minecraft:block.bell.resonate", 156}, + {"minecraft:block.bell.use", 155}, + {"minecraft:block.big_dripleaf.break", 157}, + {"minecraft:block.big_dripleaf.fall", 158}, + {"minecraft:block.big_dripleaf.hit", 159}, + {"minecraft:block.big_dripleaf.place", 160}, + {"minecraft:block.big_dripleaf.step", 161}, + {"minecraft:block.big_dripleaf.tilt_down", 467}, + {"minecraft:block.big_dripleaf.tilt_up", 468}, + {"minecraft:block.blastfurnace.fire_crackle", 182}, + {"minecraft:block.bone_block.break", 174}, + {"minecraft:block.bone_block.fall", 175}, + {"minecraft:block.bone_block.hit", 176}, + {"minecraft:block.bone_block.place", 177}, + {"minecraft:block.bone_block.step", 178}, + {"minecraft:block.brewing_stand.brew", 199}, + {"minecraft:block.bubble_column.bubble_pop", 205}, + {"minecraft:block.bubble_column.upwards_ambient", 206}, + {"minecraft:block.bubble_column.upwards_inside", 207}, + {"minecraft:block.bubble_column.whirlpool_ambient", 208}, + {"minecraft:block.bubble_column.whirlpool_inside", 209}, + {"minecraft:block.cactus_flower.break", 227}, + {"minecraft:block.cactus_flower.place", 228}, + {"minecraft:block.cake.add_candle", 229}, + {"minecraft:block.calcite.break", 230}, + {"minecraft:block.calcite.fall", 234}, + {"minecraft:block.calcite.hit", 233}, + {"minecraft:block.calcite.place", 232}, + {"minecraft:block.calcite.step", 231}, + {"minecraft:block.campfire.crackle", 246}, + {"minecraft:block.candle.ambient", 247}, + {"minecraft:block.candle.break", 248}, + {"minecraft:block.candle.extinguish", 249}, + {"minecraft:block.candle.fall", 250}, + {"minecraft:block.candle.hit", 251}, + {"minecraft:block.candle.place", 252}, + {"minecraft:block.candle.step", 253}, + {"minecraft:block.cave_vines.break", 263}, + {"minecraft:block.cave_vines.fall", 264}, + {"minecraft:block.cave_vines.hit", 265}, + {"minecraft:block.cave_vines.pick_berries", 268}, + {"minecraft:block.cave_vines.place", 266}, + {"minecraft:block.cave_vines.step", 267}, + {"minecraft:block.chain.break", 269}, + {"minecraft:block.chain.fall", 270}, + {"minecraft:block.chain.hit", 271}, + {"minecraft:block.chain.place", 272}, + {"minecraft:block.chain.step", 273}, + {"minecraft:block.cherry_leaves.break", 284}, + {"minecraft:block.cherry_leaves.fall", 285}, + {"minecraft:block.cherry_leaves.hit", 286}, + {"minecraft:block.cherry_leaves.place", 287}, + {"minecraft:block.cherry_leaves.step", 288}, + {"minecraft:block.cherry_sapling.break", 279}, + {"minecraft:block.cherry_sapling.fall", 280}, + {"minecraft:block.cherry_sapling.hit", 281}, + {"minecraft:block.cherry_sapling.place", 282}, + {"minecraft:block.cherry_sapling.step", 283}, + {"minecraft:block.cherry_wood.break", 274}, + {"minecraft:block.cherry_wood.fall", 275}, + {"minecraft:block.cherry_wood.hit", 276}, + {"minecraft:block.cherry_wood.place", 277}, + {"minecraft:block.cherry_wood.step", 278}, + {"minecraft:block.cherry_wood_button.click_off", 298}, + {"minecraft:block.cherry_wood_button.click_on", 299}, + {"minecraft:block.cherry_wood_door.close", 294}, + {"minecraft:block.cherry_wood_door.open", 295}, + {"minecraft:block.cherry_wood_fence_gate.close", 302}, + {"minecraft:block.cherry_wood_fence_gate.open", 303}, + {"minecraft:block.cherry_wood_hanging_sign.break", 290}, + {"minecraft:block.cherry_wood_hanging_sign.fall", 291}, + {"minecraft:block.cherry_wood_hanging_sign.hit", 292}, + {"minecraft:block.cherry_wood_hanging_sign.place", 293}, + {"minecraft:block.cherry_wood_hanging_sign.step", 289}, + {"minecraft:block.cherry_wood_pressure_plate.click_off", 300}, + {"minecraft:block.cherry_wood_pressure_plate.click_on", 301}, + {"minecraft:block.cherry_wood_trapdoor.close", 296}, + {"minecraft:block.cherry_wood_trapdoor.open", 297}, + {"minecraft:block.chest.close", 304}, + {"minecraft:block.chest.locked", 305}, + {"minecraft:block.chest.open", 306}, + {"minecraft:block.chiseled_bookshelf.break", 312}, + {"minecraft:block.chiseled_bookshelf.fall", 313}, + {"minecraft:block.chiseled_bookshelf.hit", 314}, + {"minecraft:block.chiseled_bookshelf.insert", 315}, + {"minecraft:block.chiseled_bookshelf.insert.enchanted", 316}, + {"minecraft:block.chiseled_bookshelf.pickup", 318}, + {"minecraft:block.chiseled_bookshelf.pickup.enchanted", 319}, + {"minecraft:block.chiseled_bookshelf.place", 320}, + {"minecraft:block.chiseled_bookshelf.step", 317}, + {"minecraft:block.chorus_flower.death", 321}, + {"minecraft:block.chorus_flower.grow", 322}, + {"minecraft:block.cobweb.break", 324}, + {"minecraft:block.cobweb.fall", 328}, + {"minecraft:block.cobweb.hit", 327}, + {"minecraft:block.cobweb.place", 326}, + {"minecraft:block.cobweb.step", 325}, + {"minecraft:block.comparator.click", 333}, + {"minecraft:block.composter.empty", 334}, + {"minecraft:block.composter.fill", 335}, + {"minecraft:block.composter.fill_success", 336}, + {"minecraft:block.composter.ready", 337}, + {"minecraft:block.conduit.activate", 338}, + {"minecraft:block.conduit.ambient", 339}, + {"minecraft:block.conduit.ambient.short", 340}, + {"minecraft:block.conduit.attack.target", 341}, + {"minecraft:block.conduit.deactivate", 342}, + {"minecraft:block.copper.break", 350}, + {"minecraft:block.copper.fall", 354}, + {"minecraft:block.copper.hit", 353}, + {"minecraft:block.copper.place", 352}, + {"minecraft:block.copper.step", 351}, + {"minecraft:block.copper_bulb.break", 343}, + {"minecraft:block.copper_bulb.fall", 347}, + {"minecraft:block.copper_bulb.hit", 346}, + {"minecraft:block.copper_bulb.place", 345}, + {"minecraft:block.copper_bulb.step", 344}, + {"minecraft:block.copper_bulb.turn_off", 349}, + {"minecraft:block.copper_bulb.turn_on", 348}, + {"minecraft:block.copper_door.close", 355}, + {"minecraft:block.copper_door.open", 356}, + {"minecraft:block.copper_grate.break", 357}, + {"minecraft:block.copper_grate.fall", 361}, + {"minecraft:block.copper_grate.hit", 360}, + {"minecraft:block.copper_grate.place", 359}, + {"minecraft:block.copper_grate.step", 358}, + {"minecraft:block.copper_trapdoor.close", 362}, + {"minecraft:block.copper_trapdoor.open", 363}, + {"minecraft:block.coral_block.break", 364}, + {"minecraft:block.coral_block.fall", 365}, + {"minecraft:block.coral_block.hit", 366}, + {"minecraft:block.coral_block.place", 367}, + {"minecraft:block.coral_block.step", 368}, + {"minecraft:block.crafter.craft", 374}, + {"minecraft:block.crafter.fail", 375}, + {"minecraft:block.creaking_heart.break", 387}, + {"minecraft:block.creaking_heart.fall", 388}, + {"minecraft:block.creaking_heart.hit", 389}, + {"minecraft:block.creaking_heart.hurt", 390}, + {"minecraft:block.creaking_heart.idle", 393}, + {"minecraft:block.creaking_heart.place", 391}, + {"minecraft:block.creaking_heart.spawn", 394}, + {"minecraft:block.creaking_heart.step", 392}, + {"minecraft:block.crop.break", 398}, + {"minecraft:block.deadbush.idle", 408}, + {"minecraft:block.decorated_pot.break", 409}, + {"minecraft:block.decorated_pot.fall", 410}, + {"minecraft:block.decorated_pot.hit", 411}, + {"minecraft:block.decorated_pot.insert", 412}, + {"minecraft:block.decorated_pot.insert_fail", 413}, + {"minecraft:block.decorated_pot.place", 415}, + {"minecraft:block.decorated_pot.shatter", 416}, + {"minecraft:block.decorated_pot.step", 414}, + {"minecraft:block.deepslate.break", 422}, + {"minecraft:block.deepslate.fall", 423}, + {"minecraft:block.deepslate.hit", 424}, + {"minecraft:block.deepslate.place", 425}, + {"minecraft:block.deepslate.step", 426}, + {"minecraft:block.deepslate_bricks.break", 417}, + {"minecraft:block.deepslate_bricks.fall", 418}, + {"minecraft:block.deepslate_bricks.hit", 419}, + {"minecraft:block.deepslate_bricks.place", 420}, + {"minecraft:block.deepslate_bricks.step", 421}, + {"minecraft:block.deepslate_tiles.break", 427}, + {"minecraft:block.deepslate_tiles.fall", 428}, + {"minecraft:block.deepslate_tiles.hit", 429}, + {"minecraft:block.deepslate_tiles.place", 430}, + {"minecraft:block.deepslate_tiles.step", 431}, + {"minecraft:block.dispenser.dispense", 432}, + {"minecraft:block.dispenser.fail", 433}, + {"minecraft:block.dispenser.launch", 434}, + {"minecraft:block.dripstone_block.break", 452}, + {"minecraft:block.dripstone_block.fall", 456}, + {"minecraft:block.dripstone_block.hit", 455}, + {"minecraft:block.dripstone_block.place", 454}, + {"minecraft:block.dripstone_block.step", 453}, + {"minecraft:block.enchantment_table.use", 489}, + {"minecraft:block.end_gateway.spawn", 512}, + {"minecraft:block.end_portal.spawn", 514}, + {"minecraft:block.end_portal_frame.fill", 513}, + {"minecraft:block.ender_chest.close", 490}, + {"minecraft:block.ender_chest.open", 491}, + {"minecraft:block.eyeblossom.close", 529}, + {"minecraft:block.eyeblossom.close_long", 528}, + {"minecraft:block.eyeblossom.idle", 530}, + {"minecraft:block.eyeblossom.open", 527}, + {"minecraft:block.eyeblossom.open_long", 526}, + {"minecraft:block.fence_gate.close", 531}, + {"minecraft:block.fence_gate.open", 532}, + {"minecraft:block.fire.ambient", 543}, + {"minecraft:block.fire.extinguish", 544}, + {"minecraft:block.firefly_bush.idle", 534}, + {"minecraft:block.flowering_azalea.break", 550}, + {"minecraft:block.flowering_azalea.fall", 551}, + {"minecraft:block.flowering_azalea.hit", 552}, + {"minecraft:block.flowering_azalea.place", 553}, + {"minecraft:block.flowering_azalea.step", 554}, + {"minecraft:block.froglight.break", 576}, + {"minecraft:block.froglight.fall", 577}, + {"minecraft:block.froglight.hit", 578}, + {"minecraft:block.froglight.place", 579}, + {"minecraft:block.froglight.step", 580}, + {"minecraft:block.frogspawn.break", 582}, + {"minecraft:block.frogspawn.fall", 583}, + {"minecraft:block.frogspawn.hatch", 584}, + {"minecraft:block.frogspawn.hit", 585}, + {"minecraft:block.frogspawn.place", 586}, + {"minecraft:block.frogspawn.step", 581}, + {"minecraft:block.fungus.break", 999}, + {"minecraft:block.fungus.fall", 1003}, + {"minecraft:block.fungus.hit", 1002}, + {"minecraft:block.fungus.place", 1001}, + {"minecraft:block.fungus.step", 1000}, + {"minecraft:block.furnace.fire_crackle", 600}, + {"minecraft:block.gilded_blackstone.break", 618}, + {"minecraft:block.gilded_blackstone.fall", 619}, + {"minecraft:block.gilded_blackstone.hit", 620}, + {"minecraft:block.gilded_blackstone.place", 621}, + {"minecraft:block.gilded_blackstone.step", 622}, + {"minecraft:block.glass.break", 623}, + {"minecraft:block.glass.fall", 624}, + {"minecraft:block.glass.hit", 625}, + {"minecraft:block.glass.place", 626}, + {"minecraft:block.glass.step", 627}, + {"minecraft:block.grass.break", 656}, + {"minecraft:block.grass.fall", 657}, + {"minecraft:block.grass.hit", 658}, + {"minecraft:block.grass.place", 659}, + {"minecraft:block.grass.step", 660}, + {"minecraft:block.gravel.break", 661}, + {"minecraft:block.gravel.fall", 662}, + {"minecraft:block.gravel.hit", 663}, + {"minecraft:block.gravel.place", 664}, + {"minecraft:block.gravel.step", 665}, + {"minecraft:block.grindstone.use", 666}, + {"minecraft:block.growing_plant.crop", 667}, + {"minecraft:block.hanging_roots.break", 676}, + {"minecraft:block.hanging_roots.fall", 677}, + {"minecraft:block.hanging_roots.hit", 678}, + {"minecraft:block.hanging_roots.place", 679}, + {"minecraft:block.hanging_roots.step", 680}, + {"minecraft:block.hanging_sign.break", 682}, + {"minecraft:block.hanging_sign.fall", 683}, + {"minecraft:block.hanging_sign.hit", 684}, + {"minecraft:block.hanging_sign.place", 685}, + {"minecraft:block.hanging_sign.step", 681}, + {"minecraft:block.hanging_sign.waxed_interact_fail", 1570}, + {"minecraft:block.heavy_core.break", 686}, + {"minecraft:block.heavy_core.fall", 687}, + {"minecraft:block.heavy_core.hit", 688}, + {"minecraft:block.heavy_core.place", 689}, + {"minecraft:block.heavy_core.step", 690}, + {"minecraft:block.honey_block.break", 726}, + {"minecraft:block.honey_block.fall", 727}, + {"minecraft:block.honey_block.hit", 728}, + {"minecraft:block.honey_block.place", 729}, + {"minecraft:block.honey_block.slide", 730}, + {"minecraft:block.honey_block.step", 731}, + {"minecraft:block.iron.break", 774}, + {"minecraft:block.iron.fall", 778}, + {"minecraft:block.iron.hit", 777}, + {"minecraft:block.iron.place", 776}, + {"minecraft:block.iron.step", 775}, + {"minecraft:block.iron_door.close", 779}, + {"minecraft:block.iron_door.open", 780}, + {"minecraft:block.iron_trapdoor.close", 787}, + {"minecraft:block.iron_trapdoor.open", 788}, + {"minecraft:block.ladder.break", 796}, + {"minecraft:block.ladder.fall", 797}, + {"minecraft:block.ladder.hit", 798}, + {"minecraft:block.ladder.place", 799}, + {"minecraft:block.ladder.step", 800}, + {"minecraft:block.lantern.break", 801}, + {"minecraft:block.lantern.fall", 802}, + {"minecraft:block.lantern.hit", 803}, + {"minecraft:block.lantern.place", 804}, + {"minecraft:block.lantern.step", 805}, + {"minecraft:block.large_amethyst_bud.break", 806}, + {"minecraft:block.large_amethyst_bud.place", 807}, + {"minecraft:block.lava.ambient", 808}, + {"minecraft:block.lava.extinguish", 809}, + {"minecraft:block.lava.pop", 810}, + {"minecraft:block.leaf_litter.break", 811}, + {"minecraft:block.leaf_litter.fall", 815}, + {"minecraft:block.leaf_litter.hit", 814}, + {"minecraft:block.leaf_litter.place", 813}, + {"minecraft:block.leaf_litter.step", 812}, + {"minecraft:block.lever.click", 818}, + {"minecraft:block.lily_pad.place", 1539}, + {"minecraft:block.lodestone.break", 832}, + {"minecraft:block.lodestone.fall", 836}, + {"minecraft:block.lodestone.hit", 835}, + {"minecraft:block.lodestone.place", 834}, + {"minecraft:block.lodestone.step", 833}, + {"minecraft:block.mangrove_roots.break", 847}, + {"minecraft:block.mangrove_roots.fall", 848}, + {"minecraft:block.mangrove_roots.hit", 849}, + {"minecraft:block.mangrove_roots.place", 850}, + {"minecraft:block.mangrove_roots.step", 851}, + {"minecraft:block.medium_amethyst_bud.break", 852}, + {"minecraft:block.medium_amethyst_bud.place", 853}, + {"minecraft:block.metal.break", 854}, + {"minecraft:block.metal.fall", 855}, + {"minecraft:block.metal.hit", 856}, + {"minecraft:block.metal.place", 857}, + {"minecraft:block.metal.step", 860}, + {"minecraft:block.metal_pressure_plate.click_off", 858}, + {"minecraft:block.metal_pressure_plate.click_on", 859}, + {"minecraft:block.moss.break", 879}, + {"minecraft:block.moss.fall", 880}, + {"minecraft:block.moss.hit", 881}, + {"minecraft:block.moss.place", 882}, + {"minecraft:block.moss.step", 883}, + {"minecraft:block.moss_carpet.break", 869}, + {"minecraft:block.moss_carpet.fall", 870}, + {"minecraft:block.moss_carpet.hit", 871}, + {"minecraft:block.moss_carpet.place", 872}, + {"minecraft:block.moss_carpet.step", 873}, + {"minecraft:block.mud.break", 884}, + {"minecraft:block.mud.fall", 885}, + {"minecraft:block.mud.hit", 886}, + {"minecraft:block.mud.place", 887}, + {"minecraft:block.mud.step", 888}, + {"minecraft:block.mud_bricks.break", 889}, + {"minecraft:block.mud_bricks.fall", 890}, + {"minecraft:block.mud_bricks.hit", 891}, + {"minecraft:block.mud_bricks.place", 892}, + {"minecraft:block.mud_bricks.step", 893}, + {"minecraft:block.muddy_mangrove_roots.break", 894}, + {"minecraft:block.muddy_mangrove_roots.fall", 895}, + {"minecraft:block.muddy_mangrove_roots.hit", 896}, + {"minecraft:block.muddy_mangrove_roots.place", 897}, + {"minecraft:block.muddy_mangrove_roots.step", 898}, + {"minecraft:block.nether_bricks.break", 956}, + {"minecraft:block.nether_bricks.fall", 960}, + {"minecraft:block.nether_bricks.hit", 959}, + {"minecraft:block.nether_bricks.place", 958}, + {"minecraft:block.nether_bricks.step", 957}, + {"minecraft:block.nether_gold_ore.break", 1201}, + {"minecraft:block.nether_gold_ore.fall", 1202}, + {"minecraft:block.nether_gold_ore.hit", 1203}, + {"minecraft:block.nether_gold_ore.place", 1204}, + {"minecraft:block.nether_gold_ore.step", 1205}, + {"minecraft:block.nether_ore.break", 1206}, + {"minecraft:block.nether_ore.fall", 1207}, + {"minecraft:block.nether_ore.hit", 1208}, + {"minecraft:block.nether_ore.place", 1209}, + {"minecraft:block.nether_ore.step", 1210}, + {"minecraft:block.nether_sprouts.break", 994}, + {"minecraft:block.nether_sprouts.fall", 998}, + {"minecraft:block.nether_sprouts.hit", 997}, + {"minecraft:block.nether_sprouts.place", 996}, + {"minecraft:block.nether_sprouts.step", 995}, + {"minecraft:block.nether_wart.break", 961}, + {"minecraft:block.nether_wood.break", 963}, + {"minecraft:block.nether_wood.fall", 964}, + {"minecraft:block.nether_wood.hit", 965}, + {"minecraft:block.nether_wood.place", 966}, + {"minecraft:block.nether_wood.step", 967}, + {"minecraft:block.nether_wood_button.click_off", 972}, + {"minecraft:block.nether_wood_button.click_on", 973}, + {"minecraft:block.nether_wood_door.close", 968}, + {"minecraft:block.nether_wood_door.open", 969}, + {"minecraft:block.nether_wood_fence_gate.close", 976}, + {"minecraft:block.nether_wood_fence_gate.open", 977}, + {"minecraft:block.nether_wood_hanging_sign.break", 692}, + {"minecraft:block.nether_wood_hanging_sign.fall", 693}, + {"minecraft:block.nether_wood_hanging_sign.hit", 694}, + {"minecraft:block.nether_wood_hanging_sign.place", 695}, + {"minecraft:block.nether_wood_hanging_sign.step", 691}, + {"minecraft:block.nether_wood_pressure_plate.click_off", 974}, + {"minecraft:block.nether_wood_pressure_plate.click_on", 975}, + {"minecraft:block.nether_wood_trapdoor.close", 970}, + {"minecraft:block.nether_wood_trapdoor.open", 971}, + {"minecraft:block.netherite_block.break", 1014}, + {"minecraft:block.netherite_block.fall", 1018}, + {"minecraft:block.netherite_block.hit", 1017}, + {"minecraft:block.netherite_block.place", 1016}, + {"minecraft:block.netherite_block.step", 1015}, + {"minecraft:block.netherrack.break", 1019}, + {"minecraft:block.netherrack.fall", 1023}, + {"minecraft:block.netherrack.hit", 1022}, + {"minecraft:block.netherrack.place", 1021}, + {"minecraft:block.netherrack.step", 1020}, + {"minecraft:block.note_block.banjo", 1039}, + {"minecraft:block.note_block.basedrum", 1024}, + {"minecraft:block.note_block.bass", 1025}, + {"minecraft:block.note_block.bell", 1026}, + {"minecraft:block.note_block.bit", 1038}, + {"minecraft:block.note_block.chime", 1027}, + {"minecraft:block.note_block.cow_bell", 1036}, + {"minecraft:block.note_block.didgeridoo", 1037}, + {"minecraft:block.note_block.flute", 1028}, + {"minecraft:block.note_block.guitar", 1029}, + {"minecraft:block.note_block.harp", 1030}, + {"minecraft:block.note_block.hat", 1031}, + {"minecraft:block.note_block.imitate.creeper", 1042}, + {"minecraft:block.note_block.imitate.ender_dragon", 1043}, + {"minecraft:block.note_block.imitate.piglin", 1045}, + {"minecraft:block.note_block.imitate.skeleton", 1041}, + {"minecraft:block.note_block.imitate.wither_skeleton", 1044}, + {"minecraft:block.note_block.imitate.zombie", 1040}, + {"minecraft:block.note_block.iron_xylophone", 1035}, + {"minecraft:block.note_block.pling", 1032}, + {"minecraft:block.note_block.snare", 1033}, + {"minecraft:block.note_block.xylophone", 1034}, + {"minecraft:block.nylium.break", 989}, + {"minecraft:block.nylium.fall", 993}, + {"minecraft:block.nylium.hit", 992}, + {"minecraft:block.nylium.place", 991}, + {"minecraft:block.nylium.step", 990}, + {"minecraft:block.packed_mud.break", 979}, + {"minecraft:block.packed_mud.fall", 980}, + {"minecraft:block.packed_mud.hit", 981}, + {"minecraft:block.packed_mud.place", 982}, + {"minecraft:block.packed_mud.step", 983}, + {"minecraft:block.pale_hanging_moss.idle", 1052}, + {"minecraft:block.pink_petals.break", 874}, + {"minecraft:block.pink_petals.fall", 875}, + {"minecraft:block.pink_petals.hit", 876}, + {"minecraft:block.pink_petals.place", 877}, + {"minecraft:block.pink_petals.step", 878}, + {"minecraft:block.piston.contract", 1137}, + {"minecraft:block.piston.extend", 1138}, + {"minecraft:block.pointed_dripstone.break", 457}, + {"minecraft:block.pointed_dripstone.drip_lava", 463}, + {"minecraft:block.pointed_dripstone.drip_lava_into_cauldron", 465}, + {"minecraft:block.pointed_dripstone.drip_water", 464}, + {"minecraft:block.pointed_dripstone.drip_water_into_cauldron", 466}, + {"minecraft:block.pointed_dripstone.fall", 461}, + {"minecraft:block.pointed_dripstone.hit", 460}, + {"minecraft:block.pointed_dripstone.land", 462}, + {"minecraft:block.pointed_dripstone.place", 459}, + {"minecraft:block.pointed_dripstone.step", 458}, + {"minecraft:block.polished_deepslate.break", 1166}, + {"minecraft:block.polished_deepslate.fall", 1167}, + {"minecraft:block.polished_deepslate.hit", 1168}, + {"minecraft:block.polished_deepslate.place", 1169}, + {"minecraft:block.polished_deepslate.step", 1170}, + {"minecraft:block.polished_tuff.break", 1466}, + {"minecraft:block.polished_tuff.fall", 1467}, + {"minecraft:block.polished_tuff.hit", 1468}, + {"minecraft:block.polished_tuff.place", 1469}, + {"minecraft:block.polished_tuff.step", 1470}, + {"minecraft:block.portal.ambient", 1171}, + {"minecraft:block.portal.travel", 1172}, + {"minecraft:block.portal.trigger", 1173}, + {"minecraft:block.powder_snow.break", 1174}, + {"minecraft:block.powder_snow.fall", 1175}, + {"minecraft:block.powder_snow.hit", 1176}, + {"minecraft:block.powder_snow.place", 1177}, + {"minecraft:block.powder_snow.step", 1178}, + {"minecraft:block.pumpkin.carve", 1186}, + {"minecraft:block.redstone_torch.burnout", 1211}, + {"minecraft:block.resin.break", 1344}, + {"minecraft:block.resin.fall", 1345}, + {"minecraft:block.resin.place", 1346}, + {"minecraft:block.resin.step", 1347}, + {"minecraft:block.resin_bricks.break", 1348}, + {"minecraft:block.resin_bricks.fall", 1349}, + {"minecraft:block.resin_bricks.hit", 1350}, + {"minecraft:block.resin_bricks.place", 1351}, + {"minecraft:block.resin_bricks.step", 1352}, + {"minecraft:block.respawn_anchor.ambient", 1212}, + {"minecraft:block.respawn_anchor.charge", 1213}, + {"minecraft:block.respawn_anchor.deplete", 1214}, + {"minecraft:block.respawn_anchor.set_spawn", 1215}, + {"minecraft:block.rooted_dirt.break", 1216}, + {"minecraft:block.rooted_dirt.fall", 1217}, + {"minecraft:block.rooted_dirt.hit", 1218}, + {"minecraft:block.rooted_dirt.place", 1219}, + {"minecraft:block.rooted_dirt.step", 1220}, + {"minecraft:block.roots.break", 595}, + {"minecraft:block.roots.fall", 599}, + {"minecraft:block.roots.hit", 598}, + {"minecraft:block.roots.place", 597}, + {"minecraft:block.roots.step", 596}, + {"minecraft:block.sand.break", 1225}, + {"minecraft:block.sand.fall", 1226}, + {"minecraft:block.sand.hit", 1227}, + {"minecraft:block.sand.idle", 1230}, + {"minecraft:block.sand.place", 1228}, + {"minecraft:block.sand.step", 1229}, + {"minecraft:block.sand.wind", 1231}, + {"minecraft:block.scaffolding.break", 1232}, + {"minecraft:block.scaffolding.fall", 1233}, + {"minecraft:block.scaffolding.hit", 1234}, + {"minecraft:block.scaffolding.place", 1235}, + {"minecraft:block.scaffolding.step", 1236}, + {"minecraft:block.sculk.break", 1239}, + {"minecraft:block.sculk.charge", 1238}, + {"minecraft:block.sculk.fall", 1240}, + {"minecraft:block.sculk.hit", 1241}, + {"minecraft:block.sculk.place", 1242}, + {"minecraft:block.sculk.spread", 1237}, + {"minecraft:block.sculk.step", 1243}, + {"minecraft:block.sculk_catalyst.bloom", 1244}, + {"minecraft:block.sculk_catalyst.break", 1245}, + {"minecraft:block.sculk_catalyst.fall", 1246}, + {"minecraft:block.sculk_catalyst.hit", 1247}, + {"minecraft:block.sculk_catalyst.place", 1248}, + {"minecraft:block.sculk_catalyst.step", 1249}, + {"minecraft:block.sculk_sensor.break", 1252}, + {"minecraft:block.sculk_sensor.clicking", 1250}, + {"minecraft:block.sculk_sensor.clicking_stop", 1251}, + {"minecraft:block.sculk_sensor.fall", 1253}, + {"minecraft:block.sculk_sensor.hit", 1254}, + {"minecraft:block.sculk_sensor.place", 1255}, + {"minecraft:block.sculk_sensor.step", 1256}, + {"minecraft:block.sculk_shrieker.break", 1257}, + {"minecraft:block.sculk_shrieker.fall", 1258}, + {"minecraft:block.sculk_shrieker.hit", 1259}, + {"minecraft:block.sculk_shrieker.place", 1260}, + {"minecraft:block.sculk_shrieker.shriek", 1261}, + {"minecraft:block.sculk_shrieker.step", 1262}, + {"minecraft:block.sculk_vein.break", 1263}, + {"minecraft:block.sculk_vein.fall", 1264}, + {"minecraft:block.sculk_vein.hit", 1265}, + {"minecraft:block.sculk_vein.place", 1266}, + {"minecraft:block.sculk_vein.step", 1267}, + {"minecraft:block.shroomlight.break", 1275}, + {"minecraft:block.shroomlight.fall", 1279}, + {"minecraft:block.shroomlight.hit", 1278}, + {"minecraft:block.shroomlight.place", 1277}, + {"minecraft:block.shroomlight.step", 1276}, + {"minecraft:block.shulker_box.close", 1282}, + {"minecraft:block.shulker_box.open", 1283}, + {"minecraft:block.sign.waxed_interact_fail", 1571}, + {"minecraft:block.slime_block.break", 1316}, + {"minecraft:block.slime_block.fall", 1317}, + {"minecraft:block.slime_block.hit", 1318}, + {"minecraft:block.slime_block.place", 1319}, + {"minecraft:block.slime_block.step", 1320}, + {"minecraft:block.small_amethyst_bud.break", 1321}, + {"minecraft:block.small_amethyst_bud.place", 1322}, + {"minecraft:block.small_dripleaf.break", 1323}, + {"minecraft:block.small_dripleaf.fall", 1324}, + {"minecraft:block.small_dripleaf.hit", 1325}, + {"minecraft:block.small_dripleaf.place", 1326}, + {"minecraft:block.small_dripleaf.step", 1327}, + {"minecraft:block.smithing_table.use", 1371}, + {"minecraft:block.smoker.smoke", 1372}, + {"minecraft:block.sniffer_egg.crack", 1386}, + {"minecraft:block.sniffer_egg.hatch", 1387}, + {"minecraft:block.sniffer_egg.plop", 1385}, + {"minecraft:block.snow.break", 1389}, + {"minecraft:block.snow.fall", 1390}, + {"minecraft:block.snow.hit", 1396}, + {"minecraft:block.snow.place", 1397}, + {"minecraft:block.snow.step", 1398}, + {"minecraft:block.soul_sand.break", 1328}, + {"minecraft:block.soul_sand.fall", 1332}, + {"minecraft:block.soul_sand.hit", 1331}, + {"minecraft:block.soul_sand.place", 1330}, + {"minecraft:block.soul_sand.step", 1329}, + {"minecraft:block.soul_soil.break", 1333}, + {"minecraft:block.soul_soil.fall", 1337}, + {"minecraft:block.soul_soil.hit", 1336}, + {"minecraft:block.soul_soil.place", 1335}, + {"minecraft:block.soul_soil.step", 1334}, + {"minecraft:block.spawner.break", 1339}, + {"minecraft:block.spawner.fall", 1340}, + {"minecraft:block.spawner.hit", 1341}, + {"minecraft:block.spawner.place", 1342}, + {"minecraft:block.spawner.step", 1343}, + {"minecraft:block.sponge.absorb", 1410}, + {"minecraft:block.sponge.break", 1405}, + {"minecraft:block.sponge.fall", 1406}, + {"minecraft:block.sponge.hit", 1407}, + {"minecraft:block.sponge.place", 1408}, + {"minecraft:block.sponge.step", 1409}, + {"minecraft:block.spore_blossom.break", 1353}, + {"minecraft:block.spore_blossom.fall", 1354}, + {"minecraft:block.spore_blossom.hit", 1355}, + {"minecraft:block.spore_blossom.place", 1356}, + {"minecraft:block.spore_blossom.step", 1357}, + {"minecraft:block.stem.break", 984}, + {"minecraft:block.stem.fall", 988}, + {"minecraft:block.stem.hit", 987}, + {"minecraft:block.stem.place", 986}, + {"minecraft:block.stem.step", 985}, + {"minecraft:block.stone.break", 1417}, + {"minecraft:block.stone.fall", 1420}, + {"minecraft:block.stone.hit", 1421}, + {"minecraft:block.stone.place", 1422}, + {"minecraft:block.stone.step", 1425}, + {"minecraft:block.stone_button.click_off", 1418}, + {"minecraft:block.stone_button.click_on", 1419}, + {"minecraft:block.stone_pressure_plate.click_off", 1423}, + {"minecraft:block.stone_pressure_plate.click_on", 1424}, + {"minecraft:block.suspicious_gravel.break", 571}, + {"minecraft:block.suspicious_gravel.fall", 575}, + {"minecraft:block.suspicious_gravel.hit", 574}, + {"minecraft:block.suspicious_gravel.place", 573}, + {"minecraft:block.suspicious_gravel.step", 572}, + {"minecraft:block.suspicious_sand.break", 566}, + {"minecraft:block.suspicious_sand.fall", 570}, + {"minecraft:block.suspicious_sand.hit", 569}, + {"minecraft:block.suspicious_sand.place", 568}, + {"minecraft:block.suspicious_sand.step", 567}, + {"minecraft:block.sweet_berry_bush.break", 1430}, + {"minecraft:block.sweet_berry_bush.pick_berries", 1432}, + {"minecraft:block.sweet_berry_bush.place", 1431}, + {"minecraft:block.trial_spawner.about_to_spawn_item", 707}, + {"minecraft:block.trial_spawner.ambient", 712}, + {"minecraft:block.trial_spawner.ambient_ominous", 713}, + {"minecraft:block.trial_spawner.break", 701}, + {"minecraft:block.trial_spawner.close_shutter", 715}, + {"minecraft:block.trial_spawner.detect_player", 710}, + {"minecraft:block.trial_spawner.eject_item", 716}, + {"minecraft:block.trial_spawner.fall", 705}, + {"minecraft:block.trial_spawner.hit", 704}, + {"minecraft:block.trial_spawner.ominous_activate", 711}, + {"minecraft:block.trial_spawner.open_shutter", 714}, + {"minecraft:block.trial_spawner.place", 703}, + {"minecraft:block.trial_spawner.spawn_item", 708}, + {"minecraft:block.trial_spawner.spawn_item_begin", 709}, + {"minecraft:block.trial_spawner.spawn_mob", 706}, + {"minecraft:block.trial_spawner.step", 702}, + {"minecraft:block.tripwire.attach", 1448}, + {"minecraft:block.tripwire.click_off", 1449}, + {"minecraft:block.tripwire.click_on", 1450}, + {"minecraft:block.tripwire.detach", 1451}, + {"minecraft:block.tuff.break", 1456}, + {"minecraft:block.tuff.fall", 1460}, + {"minecraft:block.tuff.hit", 1459}, + {"minecraft:block.tuff.place", 1458}, + {"minecraft:block.tuff.step", 1457}, + {"minecraft:block.tuff_bricks.break", 1461}, + {"minecraft:block.tuff_bricks.fall", 1462}, + {"minecraft:block.tuff_bricks.hit", 1463}, + {"minecraft:block.tuff_bricks.place", 1464}, + {"minecraft:block.tuff_bricks.step", 1465}, + {"minecraft:block.vault.activate", 1492}, + {"minecraft:block.vault.ambient", 1493}, + {"minecraft:block.vault.break", 1494}, + {"minecraft:block.vault.close_shutter", 1495}, + {"minecraft:block.vault.deactivate", 1496}, + {"minecraft:block.vault.eject_item", 1497}, + {"minecraft:block.vault.fall", 1499}, + {"minecraft:block.vault.hit", 1500}, + {"minecraft:block.vault.insert_item", 1501}, + {"minecraft:block.vault.insert_item_fail", 1502}, + {"minecraft:block.vault.open_shutter", 1503}, + {"minecraft:block.vault.place", 1504}, + {"minecraft:block.vault.reject_rewarded_player", 1498}, + {"minecraft:block.vault.step", 1505}, + {"minecraft:block.vine.break", 1534}, + {"minecraft:block.vine.fall", 1535}, + {"minecraft:block.vine.hit", 1536}, + {"minecraft:block.vine.place", 1537}, + {"minecraft:block.vine.step", 1538}, + {"minecraft:block.wart_block.break", 1009}, + {"minecraft:block.wart_block.fall", 1013}, + {"minecraft:block.wart_block.hit", 1012}, + {"minecraft:block.wart_block.place", 1011}, + {"minecraft:block.wart_block.step", 1010}, + {"minecraft:block.water.ambient", 1572}, + {"minecraft:block.weeping_vines.break", 1004}, + {"minecraft:block.weeping_vines.fall", 1008}, + {"minecraft:block.weeping_vines.hit", 1007}, + {"minecraft:block.weeping_vines.place", 1006}, + {"minecraft:block.weeping_vines.step", 1005}, + {"minecraft:block.wet_grass.break", 1575}, + {"minecraft:block.wet_grass.fall", 1576}, + {"minecraft:block.wet_grass.hit", 1577}, + {"minecraft:block.wet_grass.place", 1578}, + {"minecraft:block.wet_grass.step", 1579}, + {"minecraft:block.wet_sponge.break", 1580}, + {"minecraft:block.wet_sponge.dries", 1581}, + {"minecraft:block.wet_sponge.fall", 1582}, + {"minecraft:block.wet_sponge.hit", 1583}, + {"minecraft:block.wet_sponge.place", 1584}, + {"minecraft:block.wet_sponge.step", 1585}, + {"minecraft:block.wood.break", 1660}, + {"minecraft:block.wood.fall", 1661}, + {"minecraft:block.wood.hit", 1662}, + {"minecraft:block.wood.place", 1663}, + {"minecraft:block.wood.step", 1664}, + {"minecraft:block.wooden_button.click_off", 1656}, + {"minecraft:block.wooden_button.click_on", 1657}, + {"minecraft:block.wooden_door.close", 1652}, + {"minecraft:block.wooden_door.open", 1653}, + {"minecraft:block.wooden_pressure_plate.click_off", 1658}, + {"minecraft:block.wooden_pressure_plate.click_on", 1659}, + {"minecraft:block.wooden_trapdoor.close", 1654}, + {"minecraft:block.wooden_trapdoor.open", 1655}, + {"minecraft:block.wool.break", 1665}, + {"minecraft:block.wool.fall", 1666}, + {"minecraft:block.wool.hit", 1667}, + {"minecraft:block.wool.place", 1668}, + {"minecraft:block.wool.step", 1669}, + {"minecraft:enchant.thorns.hit", 1437}, + {"minecraft:entity.allay.ambient_with_item", 0}, + {"minecraft:entity.allay.ambient_without_item", 1}, + {"minecraft:entity.allay.death", 2}, + {"minecraft:entity.allay.hurt", 3}, + {"minecraft:entity.allay.item_given", 4}, + {"minecraft:entity.allay.item_taken", 5}, + {"minecraft:entity.allay.item_thrown", 6}, + {"minecraft:entity.armadillo.ambient", 57}, + {"minecraft:entity.armadillo.brush", 66}, + {"minecraft:entity.armadillo.death", 59}, + {"minecraft:entity.armadillo.eat", 54}, + {"minecraft:entity.armadillo.hurt", 55}, + {"minecraft:entity.armadillo.hurt_reduced", 56}, + {"minecraft:entity.armadillo.land", 61}, + {"minecraft:entity.armadillo.peek", 64}, + {"minecraft:entity.armadillo.roll", 60}, + {"minecraft:entity.armadillo.scute_drop", 62}, + {"minecraft:entity.armadillo.step", 58}, + {"minecraft:entity.armadillo.unroll_finish", 63}, + {"minecraft:entity.armadillo.unroll_start", 65}, + {"minecraft:entity.armor_stand.break", 78}, + {"minecraft:entity.armor_stand.fall", 79}, + {"minecraft:entity.armor_stand.hit", 80}, + {"minecraft:entity.armor_stand.place", 81}, + {"minecraft:entity.arrow.hit", 82}, + {"minecraft:entity.arrow.hit_player", 83}, + {"minecraft:entity.arrow.shoot", 84}, + {"minecraft:entity.axolotl.attack", 88}, + {"minecraft:entity.axolotl.death", 89}, + {"minecraft:entity.axolotl.hurt", 90}, + {"minecraft:entity.axolotl.idle_air", 91}, + {"minecraft:entity.axolotl.idle_water", 92}, + {"minecraft:entity.axolotl.splash", 93}, + {"minecraft:entity.axolotl.swim", 94}, + {"minecraft:entity.bat.ambient", 135}, + {"minecraft:entity.bat.death", 136}, + {"minecraft:entity.bat.hurt", 137}, + {"minecraft:entity.bat.loop", 138}, + {"minecraft:entity.bat.takeoff", 139}, + {"minecraft:entity.bee.death", 144}, + {"minecraft:entity.bee.hurt", 145}, + {"minecraft:entity.bee.loop", 147}, + {"minecraft:entity.bee.loop_aggressive", 146}, + {"minecraft:entity.bee.pollinate", 149}, + {"minecraft:entity.bee.sting", 148}, + {"minecraft:entity.blaze.ambient", 162}, + {"minecraft:entity.blaze.burn", 163}, + {"minecraft:entity.blaze.death", 164}, + {"minecraft:entity.blaze.hurt", 165}, + {"minecraft:entity.blaze.shoot", 166}, + {"minecraft:entity.boat.paddle_land", 167}, + {"minecraft:entity.boat.paddle_water", 168}, + {"minecraft:entity.bogged.ambient", 169}, + {"minecraft:entity.bogged.death", 170}, + {"minecraft:entity.bogged.hurt", 171}, + {"minecraft:entity.bogged.shear", 172}, + {"minecraft:entity.bogged.step", 173}, + {"minecraft:entity.breeze.charge", 186}, + {"minecraft:entity.breeze.death", 195}, + {"minecraft:entity.breeze.deflect", 187}, + {"minecraft:entity.breeze.hurt", 196}, + {"minecraft:entity.breeze.idle_air", 190}, + {"minecraft:entity.breeze.idle_ground", 189}, + {"minecraft:entity.breeze.inhale", 188}, + {"minecraft:entity.breeze.jump", 192}, + {"minecraft:entity.breeze.land", 193}, + {"minecraft:entity.breeze.shoot", 191}, + {"minecraft:entity.breeze.slide", 194}, + {"minecraft:entity.breeze.whirl", 197}, + {"minecraft:entity.breeze.wind_burst", 198}, + {"minecraft:entity.camel.ambient", 235}, + {"minecraft:entity.camel.dash", 236}, + {"minecraft:entity.camel.dash_ready", 237}, + {"minecraft:entity.camel.death", 238}, + {"minecraft:entity.camel.eat", 239}, + {"minecraft:entity.camel.hurt", 240}, + {"minecraft:entity.camel.saddle", 241}, + {"minecraft:entity.camel.sit", 242}, + {"minecraft:entity.camel.stand", 243}, + {"minecraft:entity.camel.step", 244}, + {"minecraft:entity.camel.step_sand", 245}, + {"minecraft:entity.cat.ambient", 254}, + {"minecraft:entity.cat.beg_for_food", 259}, + {"minecraft:entity.cat.death", 256}, + {"minecraft:entity.cat.eat", 257}, + {"minecraft:entity.cat.hiss", 258}, + {"minecraft:entity.cat.hurt", 260}, + {"minecraft:entity.cat.purr", 261}, + {"minecraft:entity.cat.purreow", 262}, + {"minecraft:entity.cat.stray_ambient", 255}, + {"minecraft:entity.chicken.ambient", 307}, + {"minecraft:entity.chicken.death", 308}, + {"minecraft:entity.chicken.egg", 309}, + {"minecraft:entity.chicken.hurt", 310}, + {"minecraft:entity.chicken.step", 311}, + {"minecraft:entity.cod.ambient", 329}, + {"minecraft:entity.cod.death", 330}, + {"minecraft:entity.cod.flop", 331}, + {"minecraft:entity.cod.hurt", 332}, + {"minecraft:entity.cow.ambient", 369}, + {"minecraft:entity.cow.death", 370}, + {"minecraft:entity.cow.hurt", 371}, + {"minecraft:entity.cow.milk", 372}, + {"minecraft:entity.cow.step", 373}, + {"minecraft:entity.creaking.activate", 377}, + {"minecraft:entity.creaking.ambient", 376}, + {"minecraft:entity.creaking.attack", 379}, + {"minecraft:entity.creaking.deactivate", 378}, + {"minecraft:entity.creaking.death", 380}, + {"minecraft:entity.creaking.freeze", 382}, + {"minecraft:entity.creaking.spawn", 384}, + {"minecraft:entity.creaking.step", 381}, + {"minecraft:entity.creaking.sway", 385}, + {"minecraft:entity.creaking.twitch", 386}, + {"minecraft:entity.creaking.unfreeze", 383}, + {"minecraft:entity.creeper.death", 395}, + {"minecraft:entity.creeper.hurt", 396}, + {"minecraft:entity.creeper.primed", 397}, + {"minecraft:entity.dolphin.ambient", 435}, + {"minecraft:entity.dolphin.ambient_water", 436}, + {"minecraft:entity.dolphin.attack", 437}, + {"minecraft:entity.dolphin.death", 438}, + {"minecraft:entity.dolphin.eat", 439}, + {"minecraft:entity.dolphin.hurt", 440}, + {"minecraft:entity.dolphin.jump", 441}, + {"minecraft:entity.dolphin.play", 442}, + {"minecraft:entity.dolphin.splash", 443}, + {"minecraft:entity.dolphin.swim", 444}, + {"minecraft:entity.donkey.ambient", 445}, + {"minecraft:entity.donkey.angry", 446}, + {"minecraft:entity.donkey.chest", 447}, + {"minecraft:entity.donkey.death", 448}, + {"minecraft:entity.donkey.eat", 449}, + {"minecraft:entity.donkey.hurt", 450}, + {"minecraft:entity.donkey.jump", 451}, + {"minecraft:entity.dragon_fireball.explode", 494}, + {"minecraft:entity.drowned.ambient", 469}, + {"minecraft:entity.drowned.ambient_water", 470}, + {"minecraft:entity.drowned.death", 471}, + {"minecraft:entity.drowned.death_water", 472}, + {"minecraft:entity.drowned.hurt", 473}, + {"minecraft:entity.drowned.hurt_water", 474}, + {"minecraft:entity.drowned.shoot", 475}, + {"minecraft:entity.drowned.step", 476}, + {"minecraft:entity.drowned.swim", 477}, + {"minecraft:entity.egg.throw", 479}, + {"minecraft:entity.elder_guardian.ambient", 480}, + {"minecraft:entity.elder_guardian.ambient_land", 481}, + {"minecraft:entity.elder_guardian.curse", 482}, + {"minecraft:entity.elder_guardian.death", 483}, + {"minecraft:entity.elder_guardian.death_land", 484}, + {"minecraft:entity.elder_guardian.flop", 485}, + {"minecraft:entity.elder_guardian.hurt", 486}, + {"minecraft:entity.elder_guardian.hurt_land", 487}, + {"minecraft:entity.ender_dragon.ambient", 492}, + {"minecraft:entity.ender_dragon.death", 493}, + {"minecraft:entity.ender_dragon.flap", 495}, + {"minecraft:entity.ender_dragon.growl", 496}, + {"minecraft:entity.ender_dragon.hurt", 497}, + {"minecraft:entity.ender_dragon.shoot", 498}, + {"minecraft:entity.ender_eye.death", 499}, + {"minecraft:entity.ender_eye.launch", 500}, + {"minecraft:entity.ender_pearl.throw", 511}, + {"minecraft:entity.enderman.ambient", 501}, + {"minecraft:entity.enderman.death", 502}, + {"minecraft:entity.enderman.hurt", 503}, + {"minecraft:entity.enderman.scream", 504}, + {"minecraft:entity.enderman.stare", 505}, + {"minecraft:entity.enderman.teleport", 506}, + {"minecraft:entity.endermite.ambient", 507}, + {"minecraft:entity.endermite.death", 508}, + {"minecraft:entity.endermite.hurt", 509}, + {"minecraft:entity.endermite.step", 510}, + {"minecraft:entity.evoker.ambient", 515}, + {"minecraft:entity.evoker.cast_spell", 516}, + {"minecraft:entity.evoker.celebrate", 517}, + {"minecraft:entity.evoker.death", 518}, + {"minecraft:entity.evoker.hurt", 520}, + {"minecraft:entity.evoker.prepare_attack", 521}, + {"minecraft:entity.evoker.prepare_summon", 522}, + {"minecraft:entity.evoker.prepare_wololo", 523}, + {"minecraft:entity.evoker_fangs.attack", 519}, + {"minecraft:entity.experience_bottle.throw", 524}, + {"minecraft:entity.experience_orb.pickup", 525}, + {"minecraft:entity.firework_rocket.blast", 535}, + {"minecraft:entity.firework_rocket.blast_far", 536}, + {"minecraft:entity.firework_rocket.large_blast", 537}, + {"minecraft:entity.firework_rocket.large_blast_far", 538}, + {"minecraft:entity.firework_rocket.launch", 539}, + {"minecraft:entity.firework_rocket.shoot", 540}, + {"minecraft:entity.firework_rocket.twinkle", 541}, + {"minecraft:entity.firework_rocket.twinkle_far", 542}, + {"minecraft:entity.fish.swim", 545}, + {"minecraft:entity.fishing_bobber.retrieve", 546}, + {"minecraft:entity.fishing_bobber.splash", 547}, + {"minecraft:entity.fishing_bobber.throw", 548}, + {"minecraft:entity.fox.aggro", 555}, + {"minecraft:entity.fox.ambient", 556}, + {"minecraft:entity.fox.bite", 557}, + {"minecraft:entity.fox.death", 558}, + {"minecraft:entity.fox.eat", 559}, + {"minecraft:entity.fox.hurt", 560}, + {"minecraft:entity.fox.screech", 561}, + {"minecraft:entity.fox.sleep", 562}, + {"minecraft:entity.fox.sniff", 563}, + {"minecraft:entity.fox.spit", 564}, + {"minecraft:entity.fox.teleport", 565}, + {"minecraft:entity.frog.ambient", 587}, + {"minecraft:entity.frog.death", 588}, + {"minecraft:entity.frog.eat", 589}, + {"minecraft:entity.frog.hurt", 590}, + {"minecraft:entity.frog.lay_spawn", 591}, + {"minecraft:entity.frog.long_jump", 592}, + {"minecraft:entity.frog.step", 593}, + {"minecraft:entity.frog.tongue", 594}, + {"minecraft:entity.generic.big_fall", 601}, + {"minecraft:entity.generic.burn", 602}, + {"minecraft:entity.generic.death", 603}, + {"minecraft:entity.generic.drink", 604}, + {"minecraft:entity.generic.eat", 605}, + {"minecraft:entity.generic.explode", 606}, + {"minecraft:entity.generic.extinguish_fire", 607}, + {"minecraft:entity.generic.hurt", 608}, + {"minecraft:entity.generic.small_fall", 609}, + {"minecraft:entity.generic.splash", 610}, + {"minecraft:entity.generic.swim", 611}, + {"minecraft:entity.ghast.ambient", 612}, + {"minecraft:entity.ghast.death", 613}, + {"minecraft:entity.ghast.hurt", 614}, + {"minecraft:entity.ghast.scream", 615}, + {"minecraft:entity.ghast.shoot", 616}, + {"minecraft:entity.ghast.warn", 617}, + {"minecraft:entity.glow_item_frame.add_item", 629}, + {"minecraft:entity.glow_item_frame.break", 630}, + {"minecraft:entity.glow_item_frame.place", 631}, + {"minecraft:entity.glow_item_frame.remove_item", 632}, + {"minecraft:entity.glow_item_frame.rotate_item", 633}, + {"minecraft:entity.glow_squid.ambient", 634}, + {"minecraft:entity.glow_squid.death", 635}, + {"minecraft:entity.glow_squid.hurt", 636}, + {"minecraft:entity.glow_squid.squirt", 637}, + {"minecraft:entity.goat.ambient", 638}, + {"minecraft:entity.goat.death", 639}, + {"minecraft:entity.goat.eat", 640}, + {"minecraft:entity.goat.horn_break", 646}, + {"minecraft:entity.goat.hurt", 641}, + {"minecraft:entity.goat.long_jump", 642}, + {"minecraft:entity.goat.milk", 643}, + {"minecraft:entity.goat.prepare_ram", 644}, + {"minecraft:entity.goat.ram_impact", 645}, + {"minecraft:entity.goat.screaming.ambient", 647}, + {"minecraft:entity.goat.screaming.death", 648}, + {"minecraft:entity.goat.screaming.eat", 649}, + {"minecraft:entity.goat.screaming.hurt", 650}, + {"minecraft:entity.goat.screaming.long_jump", 651}, + {"minecraft:entity.goat.screaming.milk", 652}, + {"minecraft:entity.goat.screaming.prepare_ram", 653}, + {"minecraft:entity.goat.screaming.ram_impact", 654}, + {"minecraft:entity.goat.step", 655}, + {"minecraft:entity.guardian.ambient", 668}, + {"minecraft:entity.guardian.ambient_land", 669}, + {"minecraft:entity.guardian.attack", 670}, + {"minecraft:entity.guardian.death", 671}, + {"minecraft:entity.guardian.death_land", 672}, + {"minecraft:entity.guardian.flop", 673}, + {"minecraft:entity.guardian.hurt", 674}, + {"minecraft:entity.guardian.hurt_land", 675}, + {"minecraft:entity.hoglin.ambient", 718}, + {"minecraft:entity.hoglin.angry", 719}, + {"minecraft:entity.hoglin.attack", 720}, + {"minecraft:entity.hoglin.converted_to_zombified", 721}, + {"minecraft:entity.hoglin.death", 722}, + {"minecraft:entity.hoglin.hurt", 723}, + {"minecraft:entity.hoglin.retreat", 724}, + {"minecraft:entity.hoglin.step", 725}, + {"minecraft:entity.horse.ambient", 742}, + {"minecraft:entity.horse.angry", 743}, + {"minecraft:entity.horse.armor", 744}, + {"minecraft:entity.horse.breathe", 745}, + {"minecraft:entity.horse.death", 746}, + {"minecraft:entity.horse.eat", 747}, + {"minecraft:entity.horse.gallop", 748}, + {"minecraft:entity.horse.hurt", 749}, + {"minecraft:entity.horse.jump", 750}, + {"minecraft:entity.horse.land", 751}, + {"minecraft:entity.horse.saddle", 752}, + {"minecraft:entity.horse.step", 753}, + {"minecraft:entity.horse.step_wood", 754}, + {"minecraft:entity.hostile.big_fall", 755}, + {"minecraft:entity.hostile.death", 756}, + {"minecraft:entity.hostile.hurt", 757}, + {"minecraft:entity.hostile.small_fall", 758}, + {"minecraft:entity.hostile.splash", 759}, + {"minecraft:entity.hostile.swim", 760}, + {"minecraft:entity.husk.ambient", 761}, + {"minecraft:entity.husk.converted_to_zombie", 762}, + {"minecraft:entity.husk.death", 763}, + {"minecraft:entity.husk.hurt", 764}, + {"minecraft:entity.husk.step", 765}, + {"minecraft:entity.illusioner.ambient", 766}, + {"minecraft:entity.illusioner.cast_spell", 767}, + {"minecraft:entity.illusioner.death", 768}, + {"minecraft:entity.illusioner.hurt", 769}, + {"minecraft:entity.illusioner.mirror_move", 770}, + {"minecraft:entity.illusioner.prepare_blindness", 771}, + {"minecraft:entity.illusioner.prepare_mirror", 772}, + {"minecraft:entity.iron_golem.attack", 781}, + {"minecraft:entity.iron_golem.damage", 782}, + {"minecraft:entity.iron_golem.death", 783}, + {"minecraft:entity.iron_golem.hurt", 784}, + {"minecraft:entity.iron_golem.repair", 785}, + {"minecraft:entity.iron_golem.step", 786}, + {"minecraft:entity.item.break", 794}, + {"minecraft:entity.item.pickup", 795}, + {"minecraft:entity.item_frame.add_item", 789}, + {"minecraft:entity.item_frame.break", 790}, + {"minecraft:entity.item_frame.place", 791}, + {"minecraft:entity.item_frame.remove_item", 792}, + {"minecraft:entity.item_frame.rotate_item", 793}, + {"minecraft:entity.leash_knot.break", 816}, + {"minecraft:entity.leash_knot.place", 817}, + {"minecraft:entity.lightning_bolt.impact", 819}, + {"minecraft:entity.lightning_bolt.thunder", 820}, + {"minecraft:entity.lingering_potion.throw", 821}, + {"minecraft:entity.llama.ambient", 822}, + {"minecraft:entity.llama.angry", 823}, + {"minecraft:entity.llama.chest", 824}, + {"minecraft:entity.llama.death", 825}, + {"minecraft:entity.llama.eat", 826}, + {"minecraft:entity.llama.hurt", 827}, + {"minecraft:entity.llama.spit", 828}, + {"minecraft:entity.llama.step", 829}, + {"minecraft:entity.llama.swag", 830}, + {"minecraft:entity.magma_cube.death", 841}, + {"minecraft:entity.magma_cube.death_small", 831}, + {"minecraft:entity.magma_cube.hurt", 842}, + {"minecraft:entity.magma_cube.hurt_small", 843}, + {"minecraft:entity.magma_cube.jump", 844}, + {"minecraft:entity.magma_cube.squish", 845}, + {"minecraft:entity.magma_cube.squish_small", 846}, + {"minecraft:entity.minecart.inside", 862}, + {"minecraft:entity.minecart.inside.underwater", 861}, + {"minecraft:entity.minecart.riding", 863}, + {"minecraft:entity.mooshroom.convert", 864}, + {"minecraft:entity.mooshroom.eat", 865}, + {"minecraft:entity.mooshroom.milk", 866}, + {"minecraft:entity.mooshroom.shear", 868}, + {"minecraft:entity.mooshroom.suspicious_milk", 867}, + {"minecraft:entity.mule.ambient", 899}, + {"minecraft:entity.mule.angry", 900}, + {"minecraft:entity.mule.chest", 901}, + {"minecraft:entity.mule.death", 902}, + {"minecraft:entity.mule.eat", 903}, + {"minecraft:entity.mule.hurt", 904}, + {"minecraft:entity.mule.jump", 905}, + {"minecraft:entity.ocelot.ambient", 1047}, + {"minecraft:entity.ocelot.death", 1048}, + {"minecraft:entity.ocelot.hurt", 1046}, + {"minecraft:entity.painting.break", 1050}, + {"minecraft:entity.painting.place", 1051}, + {"minecraft:entity.panda.aggressive_ambient", 1060}, + {"minecraft:entity.panda.ambient", 1055}, + {"minecraft:entity.panda.bite", 1063}, + {"minecraft:entity.panda.cant_breed", 1059}, + {"minecraft:entity.panda.death", 1056}, + {"minecraft:entity.panda.eat", 1057}, + {"minecraft:entity.panda.hurt", 1062}, + {"minecraft:entity.panda.pre_sneeze", 1053}, + {"minecraft:entity.panda.sneeze", 1054}, + {"minecraft:entity.panda.step", 1058}, + {"minecraft:entity.panda.worried_ambient", 1061}, + {"minecraft:entity.parrot.ambient", 1064}, + {"minecraft:entity.parrot.death", 1065}, + {"minecraft:entity.parrot.eat", 1066}, + {"minecraft:entity.parrot.fly", 1067}, + {"minecraft:entity.parrot.hurt", 1068}, + {"minecraft:entity.parrot.imitate.blaze", 1069}, + {"minecraft:entity.parrot.imitate.bogged", 1070}, + {"minecraft:entity.parrot.imitate.breeze", 1071}, + {"minecraft:entity.parrot.imitate.creaking", 1072}, + {"minecraft:entity.parrot.imitate.creeper", 1073}, + {"minecraft:entity.parrot.imitate.drowned", 1074}, + {"minecraft:entity.parrot.imitate.elder_guardian", 1075}, + {"minecraft:entity.parrot.imitate.ender_dragon", 1076}, + {"minecraft:entity.parrot.imitate.endermite", 1077}, + {"minecraft:entity.parrot.imitate.evoker", 1078}, + {"minecraft:entity.parrot.imitate.ghast", 1079}, + {"minecraft:entity.parrot.imitate.guardian", 1080}, + {"minecraft:entity.parrot.imitate.hoglin", 1081}, + {"minecraft:entity.parrot.imitate.husk", 1082}, + {"minecraft:entity.parrot.imitate.illusioner", 1083}, + {"minecraft:entity.parrot.imitate.magma_cube", 1084}, + {"minecraft:entity.parrot.imitate.phantom", 1085}, + {"minecraft:entity.parrot.imitate.piglin", 1086}, + {"minecraft:entity.parrot.imitate.piglin_brute", 1087}, + {"minecraft:entity.parrot.imitate.pillager", 1088}, + {"minecraft:entity.parrot.imitate.ravager", 1089}, + {"minecraft:entity.parrot.imitate.shulker", 1090}, + {"minecraft:entity.parrot.imitate.silverfish", 1091}, + {"minecraft:entity.parrot.imitate.skeleton", 1092}, + {"minecraft:entity.parrot.imitate.slime", 1093}, + {"minecraft:entity.parrot.imitate.spider", 1094}, + {"minecraft:entity.parrot.imitate.stray", 1095}, + {"minecraft:entity.parrot.imitate.vex", 1096}, + {"minecraft:entity.parrot.imitate.vindicator", 1097}, + {"minecraft:entity.parrot.imitate.warden", 1098}, + {"minecraft:entity.parrot.imitate.witch", 1099}, + {"minecraft:entity.parrot.imitate.wither", 1100}, + {"minecraft:entity.parrot.imitate.wither_skeleton", 1101}, + {"minecraft:entity.parrot.imitate.zoglin", 1102}, + {"minecraft:entity.parrot.imitate.zombie", 1103}, + {"minecraft:entity.parrot.imitate.zombie_villager", 1104}, + {"minecraft:entity.parrot.step", 1105}, + {"minecraft:entity.phantom.ambient", 1106}, + {"minecraft:entity.phantom.bite", 1107}, + {"minecraft:entity.phantom.death", 1108}, + {"minecraft:entity.phantom.flap", 1109}, + {"minecraft:entity.phantom.hurt", 1110}, + {"minecraft:entity.phantom.swoop", 1111}, + {"minecraft:entity.pig.ambient", 1112}, + {"minecraft:entity.pig.death", 1113}, + {"minecraft:entity.pig.hurt", 1114}, + {"minecraft:entity.pig.saddle", 1115}, + {"minecraft:entity.pig.step", 1116}, + {"minecraft:entity.piglin.admiring_item", 1117}, + {"minecraft:entity.piglin.ambient", 1118}, + {"minecraft:entity.piglin.angry", 1119}, + {"minecraft:entity.piglin.celebrate", 1120}, + {"minecraft:entity.piglin.converted_to_zombified", 1126}, + {"minecraft:entity.piglin.death", 1121}, + {"minecraft:entity.piglin.hurt", 1123}, + {"minecraft:entity.piglin.jealous", 1122}, + {"minecraft:entity.piglin.retreat", 1124}, + {"minecraft:entity.piglin.step", 1125}, + {"minecraft:entity.piglin_brute.ambient", 1127}, + {"minecraft:entity.piglin_brute.angry", 1128}, + {"minecraft:entity.piglin_brute.converted_to_zombified", 1132}, + {"minecraft:entity.piglin_brute.death", 1129}, + {"minecraft:entity.piglin_brute.hurt", 1130}, + {"minecraft:entity.piglin_brute.step", 1131}, + {"minecraft:entity.pillager.ambient", 1133}, + {"minecraft:entity.pillager.celebrate", 1134}, + {"minecraft:entity.pillager.death", 1135}, + {"minecraft:entity.pillager.hurt", 1136}, + {"minecraft:entity.player.attack.crit", 1139}, + {"minecraft:entity.player.attack.knockback", 1140}, + {"minecraft:entity.player.attack.nodamage", 1141}, + {"minecraft:entity.player.attack.strong", 1142}, + {"minecraft:entity.player.attack.sweep", 1143}, + {"minecraft:entity.player.attack.weak", 1144}, + {"minecraft:entity.player.big_fall", 1145}, + {"minecraft:entity.player.breath", 1146}, + {"minecraft:entity.player.burp", 1147}, + {"minecraft:entity.player.death", 1148}, + {"minecraft:entity.player.hurt", 1149}, + {"minecraft:entity.player.hurt_drown", 1150}, + {"minecraft:entity.player.hurt_freeze", 1151}, + {"minecraft:entity.player.hurt_on_fire", 1152}, + {"minecraft:entity.player.hurt_sweet_berry_bush", 1153}, + {"minecraft:entity.player.levelup", 1154}, + {"minecraft:entity.player.small_fall", 1155}, + {"minecraft:entity.player.splash", 1156}, + {"minecraft:entity.player.splash.high_speed", 1157}, + {"minecraft:entity.player.swim", 1158}, + {"minecraft:entity.player.teleport", 1159}, + {"minecraft:entity.polar_bear.ambient", 1160}, + {"minecraft:entity.polar_bear.ambient_baby", 1161}, + {"minecraft:entity.polar_bear.death", 1162}, + {"minecraft:entity.polar_bear.hurt", 1163}, + {"minecraft:entity.polar_bear.step", 1164}, + {"minecraft:entity.polar_bear.warning", 1165}, + {"minecraft:entity.puffer_fish.ambient", 1179}, + {"minecraft:entity.puffer_fish.blow_out", 1180}, + {"minecraft:entity.puffer_fish.blow_up", 1181}, + {"minecraft:entity.puffer_fish.death", 1182}, + {"minecraft:entity.puffer_fish.flop", 1183}, + {"minecraft:entity.puffer_fish.hurt", 1184}, + {"minecraft:entity.puffer_fish.sting", 1185}, + {"minecraft:entity.rabbit.ambient", 1187}, + {"minecraft:entity.rabbit.attack", 1188}, + {"minecraft:entity.rabbit.death", 1189}, + {"minecraft:entity.rabbit.hurt", 1190}, + {"minecraft:entity.rabbit.jump", 1191}, + {"minecraft:entity.ravager.ambient", 1193}, + {"minecraft:entity.ravager.attack", 1194}, + {"minecraft:entity.ravager.celebrate", 1195}, + {"minecraft:entity.ravager.death", 1196}, + {"minecraft:entity.ravager.hurt", 1197}, + {"minecraft:entity.ravager.roar", 1200}, + {"minecraft:entity.ravager.step", 1198}, + {"minecraft:entity.ravager.stunned", 1199}, + {"minecraft:entity.salmon.ambient", 1221}, + {"minecraft:entity.salmon.death", 1222}, + {"minecraft:entity.salmon.flop", 1223}, + {"minecraft:entity.salmon.hurt", 1224}, + {"minecraft:entity.sheep.ambient", 1268}, + {"minecraft:entity.sheep.death", 1269}, + {"minecraft:entity.sheep.hurt", 1270}, + {"minecraft:entity.sheep.shear", 1271}, + {"minecraft:entity.sheep.step", 1272}, + {"minecraft:entity.shulker.ambient", 1281}, + {"minecraft:entity.shulker.close", 1286}, + {"minecraft:entity.shulker.death", 1287}, + {"minecraft:entity.shulker.hurt", 1288}, + {"minecraft:entity.shulker.hurt_closed", 1289}, + {"minecraft:entity.shulker.open", 1290}, + {"minecraft:entity.shulker.shoot", 1291}, + {"minecraft:entity.shulker.teleport", 1292}, + {"minecraft:entity.shulker_bullet.hit", 1284}, + {"minecraft:entity.shulker_bullet.hurt", 1285}, + {"minecraft:entity.silverfish.ambient", 1293}, + {"minecraft:entity.silverfish.death", 1294}, + {"minecraft:entity.silverfish.hurt", 1295}, + {"minecraft:entity.silverfish.step", 1296}, + {"minecraft:entity.skeleton.ambient", 1297}, + {"minecraft:entity.skeleton.converted_to_stray", 1298}, + {"minecraft:entity.skeleton.death", 1299}, + {"minecraft:entity.skeleton.hurt", 1308}, + {"minecraft:entity.skeleton.shoot", 1309}, + {"minecraft:entity.skeleton.step", 1310}, + {"minecraft:entity.skeleton_horse.ambient", 1300}, + {"minecraft:entity.skeleton_horse.ambient_water", 1304}, + {"minecraft:entity.skeleton_horse.death", 1301}, + {"minecraft:entity.skeleton_horse.gallop_water", 1305}, + {"minecraft:entity.skeleton_horse.hurt", 1302}, + {"minecraft:entity.skeleton_horse.jump_water", 1306}, + {"minecraft:entity.skeleton_horse.step_water", 1307}, + {"minecraft:entity.skeleton_horse.swim", 1303}, + {"minecraft:entity.slime.attack", 1311}, + {"minecraft:entity.slime.death", 1312}, + {"minecraft:entity.slime.death_small", 1367}, + {"minecraft:entity.slime.hurt", 1313}, + {"minecraft:entity.slime.hurt_small", 1368}, + {"minecraft:entity.slime.jump", 1314}, + {"minecraft:entity.slime.jump_small", 1369}, + {"minecraft:entity.slime.squish", 1315}, + {"minecraft:entity.slime.squish_small", 1370}, + {"minecraft:entity.sniffer.death", 1377}, + {"minecraft:entity.sniffer.digging", 1382}, + {"minecraft:entity.sniffer.digging_stop", 1383}, + {"minecraft:entity.sniffer.drop_seed", 1378}, + {"minecraft:entity.sniffer.eat", 1374}, + {"minecraft:entity.sniffer.happy", 1384}, + {"minecraft:entity.sniffer.hurt", 1376}, + {"minecraft:entity.sniffer.idle", 1375}, + {"minecraft:entity.sniffer.scenting", 1379}, + {"minecraft:entity.sniffer.searching", 1381}, + {"minecraft:entity.sniffer.sniffing", 1380}, + {"minecraft:entity.sniffer.step", 1373}, + {"minecraft:entity.snow_golem.ambient", 1391}, + {"minecraft:entity.snow_golem.death", 1392}, + {"minecraft:entity.snow_golem.hurt", 1393}, + {"minecraft:entity.snow_golem.shear", 1395}, + {"minecraft:entity.snow_golem.shoot", 1394}, + {"minecraft:entity.snowball.throw", 1388}, + {"minecraft:entity.spider.ambient", 1399}, + {"minecraft:entity.spider.death", 1400}, + {"minecraft:entity.spider.hurt", 1401}, + {"minecraft:entity.spider.step", 1402}, + {"minecraft:entity.splash_potion.break", 1403}, + {"minecraft:entity.splash_potion.throw", 1404}, + {"minecraft:entity.squid.ambient", 1413}, + {"minecraft:entity.squid.death", 1414}, + {"minecraft:entity.squid.hurt", 1415}, + {"minecraft:entity.squid.squirt", 1416}, + {"minecraft:entity.stray.ambient", 1426}, + {"minecraft:entity.stray.death", 1427}, + {"minecraft:entity.stray.hurt", 1428}, + {"minecraft:entity.stray.step", 1429}, + {"minecraft:entity.strider.ambient", 1358}, + {"minecraft:entity.strider.death", 1361}, + {"minecraft:entity.strider.eat", 1365}, + {"minecraft:entity.strider.happy", 1359}, + {"minecraft:entity.strider.hurt", 1362}, + {"minecraft:entity.strider.retreat", 1360}, + {"minecraft:entity.strider.saddle", 1366}, + {"minecraft:entity.strider.step", 1363}, + {"minecraft:entity.strider.step_lava", 1364}, + {"minecraft:entity.tadpole.death", 1433}, + {"minecraft:entity.tadpole.flop", 1434}, + {"minecraft:entity.tadpole.grow_up", 1435}, + {"minecraft:entity.tadpole.hurt", 1436}, + {"minecraft:entity.tnt.primed", 1438}, + {"minecraft:entity.tropical_fish.ambient", 1452}, + {"minecraft:entity.tropical_fish.death", 1453}, + {"minecraft:entity.tropical_fish.flop", 1454}, + {"minecraft:entity.tropical_fish.hurt", 1455}, + {"minecraft:entity.turtle.ambient_land", 1471}, + {"minecraft:entity.turtle.death", 1472}, + {"minecraft:entity.turtle.death_baby", 1473}, + {"minecraft:entity.turtle.egg_break", 1474}, + {"minecraft:entity.turtle.egg_crack", 1475}, + {"minecraft:entity.turtle.egg_hatch", 1476}, + {"minecraft:entity.turtle.hurt", 1477}, + {"minecraft:entity.turtle.hurt_baby", 1478}, + {"minecraft:entity.turtle.lay_egg", 1479}, + {"minecraft:entity.turtle.shamble", 1480}, + {"minecraft:entity.turtle.shamble_baby", 1481}, + {"minecraft:entity.turtle.swim", 1482}, + {"minecraft:entity.vex.ambient", 1506}, + {"minecraft:entity.vex.charge", 1507}, + {"minecraft:entity.vex.death", 1508}, + {"minecraft:entity.vex.hurt", 1509}, + {"minecraft:entity.villager.ambient", 1510}, + {"minecraft:entity.villager.celebrate", 1511}, + {"minecraft:entity.villager.death", 1512}, + {"minecraft:entity.villager.hurt", 1513}, + {"minecraft:entity.villager.no", 1514}, + {"minecraft:entity.villager.trade", 1515}, + {"minecraft:entity.villager.work_armorer", 1517}, + {"minecraft:entity.villager.work_butcher", 1518}, + {"minecraft:entity.villager.work_cartographer", 1519}, + {"minecraft:entity.villager.work_cleric", 1520}, + {"minecraft:entity.villager.work_farmer", 1521}, + {"minecraft:entity.villager.work_fisherman", 1522}, + {"minecraft:entity.villager.work_fletcher", 1523}, + {"minecraft:entity.villager.work_leatherworker", 1524}, + {"minecraft:entity.villager.work_librarian", 1525}, + {"minecraft:entity.villager.work_mason", 1526}, + {"minecraft:entity.villager.work_shepherd", 1527}, + {"minecraft:entity.villager.work_toolsmith", 1528}, + {"minecraft:entity.villager.work_weaponsmith", 1529}, + {"minecraft:entity.villager.yes", 1516}, + {"minecraft:entity.vindicator.ambient", 1530}, + {"minecraft:entity.vindicator.celebrate", 1531}, + {"minecraft:entity.vindicator.death", 1532}, + {"minecraft:entity.vindicator.hurt", 1533}, + {"minecraft:entity.wandering_trader.ambient", 1540}, + {"minecraft:entity.wandering_trader.death", 1541}, + {"minecraft:entity.wandering_trader.disappeared", 1542}, + {"minecraft:entity.wandering_trader.drink_milk", 1543}, + {"minecraft:entity.wandering_trader.drink_potion", 1544}, + {"minecraft:entity.wandering_trader.hurt", 1545}, + {"minecraft:entity.wandering_trader.no", 1546}, + {"minecraft:entity.wandering_trader.reappeared", 1547}, + {"minecraft:entity.wandering_trader.trade", 1548}, + {"minecraft:entity.wandering_trader.yes", 1549}, + {"minecraft:entity.warden.agitated", 1550}, + {"minecraft:entity.warden.ambient", 1551}, + {"minecraft:entity.warden.angry", 1552}, + {"minecraft:entity.warden.attack_impact", 1553}, + {"minecraft:entity.warden.death", 1554}, + {"minecraft:entity.warden.dig", 1555}, + {"minecraft:entity.warden.emerge", 1556}, + {"minecraft:entity.warden.heartbeat", 1557}, + {"minecraft:entity.warden.hurt", 1558}, + {"minecraft:entity.warden.listening", 1559}, + {"minecraft:entity.warden.listening_angry", 1560}, + {"minecraft:entity.warden.nearby_close", 1561}, + {"minecraft:entity.warden.nearby_closer", 1562}, + {"minecraft:entity.warden.nearby_closest", 1563}, + {"minecraft:entity.warden.roar", 1564}, + {"minecraft:entity.warden.sniff", 1565}, + {"minecraft:entity.warden.sonic_boom", 1566}, + {"minecraft:entity.warden.sonic_charge", 1567}, + {"minecraft:entity.warden.step", 1568}, + {"minecraft:entity.warden.tendril_clicks", 1569}, + {"minecraft:entity.wind_charge.throw", 1587}, + {"minecraft:entity.wind_charge.wind_burst", 1586}, + {"minecraft:entity.witch.ambient", 1588}, + {"minecraft:entity.witch.celebrate", 1589}, + {"minecraft:entity.witch.death", 1590}, + {"minecraft:entity.witch.drink", 1591}, + {"minecraft:entity.witch.hurt", 1592}, + {"minecraft:entity.witch.throw", 1593}, + {"minecraft:entity.wither.ambient", 1594}, + {"minecraft:entity.wither.break_block", 1595}, + {"minecraft:entity.wither.death", 1596}, + {"minecraft:entity.wither.hurt", 1597}, + {"minecraft:entity.wither.shoot", 1598}, + {"minecraft:entity.wither.spawn", 1603}, + {"minecraft:entity.wither_skeleton.ambient", 1599}, + {"minecraft:entity.wither_skeleton.death", 1600}, + {"minecraft:entity.wither_skeleton.hurt", 1601}, + {"minecraft:entity.wither_skeleton.step", 1602}, + {"minecraft:entity.wolf.ambient", 1610}, + {"minecraft:entity.wolf.death", 1611}, + {"minecraft:entity.wolf.growl", 1612}, + {"minecraft:entity.wolf.hurt", 1613}, + {"minecraft:entity.wolf.pant", 1614}, + {"minecraft:entity.wolf.shake", 1608}, + {"minecraft:entity.wolf.step", 1609}, + {"minecraft:entity.wolf.whine", 1615}, + {"minecraft:entity.wolf_angry.ambient", 1628}, + {"minecraft:entity.wolf_angry.death", 1629}, + {"minecraft:entity.wolf_angry.growl", 1630}, + {"minecraft:entity.wolf_angry.hurt", 1631}, + {"minecraft:entity.wolf_angry.pant", 1632}, + {"minecraft:entity.wolf_angry.whine", 1633}, + {"minecraft:entity.wolf_big.ambient", 1640}, + {"minecraft:entity.wolf_big.death", 1641}, + {"minecraft:entity.wolf_big.growl", 1642}, + {"minecraft:entity.wolf_big.hurt", 1643}, + {"minecraft:entity.wolf_big.pant", 1644}, + {"minecraft:entity.wolf_big.whine", 1645}, + {"minecraft:entity.wolf_cute.ambient", 1646}, + {"minecraft:entity.wolf_cute.death", 1647}, + {"minecraft:entity.wolf_cute.growl", 1648}, + {"minecraft:entity.wolf_cute.hurt", 1649}, + {"minecraft:entity.wolf_cute.pant", 1650}, + {"minecraft:entity.wolf_cute.whine", 1651}, + {"minecraft:entity.wolf_grumpy.ambient", 1634}, + {"minecraft:entity.wolf_grumpy.death", 1635}, + {"minecraft:entity.wolf_grumpy.growl", 1636}, + {"minecraft:entity.wolf_grumpy.hurt", 1637}, + {"minecraft:entity.wolf_grumpy.pant", 1638}, + {"minecraft:entity.wolf_grumpy.whine", 1639}, + {"minecraft:entity.wolf_puglin.ambient", 1616}, + {"minecraft:entity.wolf_puglin.death", 1617}, + {"minecraft:entity.wolf_puglin.growl", 1618}, + {"minecraft:entity.wolf_puglin.hurt", 1619}, + {"minecraft:entity.wolf_puglin.pant", 1620}, + {"minecraft:entity.wolf_puglin.whine", 1621}, + {"minecraft:entity.wolf_sad.ambient", 1622}, + {"minecraft:entity.wolf_sad.death", 1623}, + {"minecraft:entity.wolf_sad.growl", 1624}, + {"minecraft:entity.wolf_sad.hurt", 1625}, + {"minecraft:entity.wolf_sad.pant", 1626}, + {"minecraft:entity.wolf_sad.whine", 1627}, + {"minecraft:entity.zoglin.ambient", 1670}, + {"minecraft:entity.zoglin.angry", 1671}, + {"minecraft:entity.zoglin.attack", 1672}, + {"minecraft:entity.zoglin.death", 1673}, + {"minecraft:entity.zoglin.hurt", 1674}, + {"minecraft:entity.zoglin.step", 1675}, + {"minecraft:entity.zombie.ambient", 1676}, + {"minecraft:entity.zombie.attack_iron_door", 1678}, + {"minecraft:entity.zombie.attack_wooden_door", 1677}, + {"minecraft:entity.zombie.break_wooden_door", 1679}, + {"minecraft:entity.zombie.converted_to_drowned", 1680}, + {"minecraft:entity.zombie.death", 1681}, + {"minecraft:entity.zombie.destroy_egg", 1682}, + {"minecraft:entity.zombie.hurt", 1686}, + {"minecraft:entity.zombie.infect", 1687}, + {"minecraft:entity.zombie.step", 1692}, + {"minecraft:entity.zombie_horse.ambient", 1683}, + {"minecraft:entity.zombie_horse.death", 1684}, + {"minecraft:entity.zombie_horse.hurt", 1685}, + {"minecraft:entity.zombie_villager.ambient", 1693}, + {"minecraft:entity.zombie_villager.converted", 1694}, + {"minecraft:entity.zombie_villager.cure", 1695}, + {"minecraft:entity.zombie_villager.death", 1696}, + {"minecraft:entity.zombie_villager.hurt", 1697}, + {"minecraft:entity.zombie_villager.step", 1698}, + {"minecraft:entity.zombified_piglin.ambient", 1688}, + {"minecraft:entity.zombified_piglin.angry", 1689}, + {"minecraft:entity.zombified_piglin.death", 1690}, + {"minecraft:entity.zombified_piglin.hurt", 1691}, + {"minecraft:event.mob_effect.bad_omen", 1699}, + {"minecraft:event.mob_effect.raid_omen", 1701}, + {"minecraft:event.mob_effect.trial_omen", 1700}, + {"minecraft:event.raid.horn", 1192}, + {"minecraft:intentionally_empty", 978}, + {"minecraft:item.armor.equip_chain", 67}, + {"minecraft:item.armor.equip_diamond", 68}, + {"minecraft:item.armor.equip_elytra", 69}, + {"minecraft:item.armor.equip_generic", 70}, + {"minecraft:item.armor.equip_gold", 71}, + {"minecraft:item.armor.equip_iron", 72}, + {"minecraft:item.armor.equip_leather", 73}, + {"minecraft:item.armor.equip_netherite", 74}, + {"minecraft:item.armor.equip_turtle", 75}, + {"minecraft:item.armor.equip_wolf", 76}, + {"minecraft:item.armor.unequip_wolf", 77}, + {"minecraft:item.axe.scrape", 86}, + {"minecraft:item.axe.strip", 85}, + {"minecraft:item.axe.wax_off", 87}, + {"minecraft:item.bone_meal.use", 179}, + {"minecraft:item.book.page_turn", 180}, + {"minecraft:item.book.put", 181}, + {"minecraft:item.bottle.empty", 183}, + {"minecraft:item.bottle.fill", 184}, + {"minecraft:item.bottle.fill_dragonbreath", 185}, + {"minecraft:item.brush.brushing.generic", 200}, + {"minecraft:item.brush.brushing.gravel", 202}, + {"minecraft:item.brush.brushing.gravel.complete", 204}, + {"minecraft:item.brush.brushing.sand", 201}, + {"minecraft:item.brush.brushing.sand.complete", 203}, + {"minecraft:item.bucket.empty", 211}, + {"minecraft:item.bucket.empty_axolotl", 212}, + {"minecraft:item.bucket.empty_fish", 213}, + {"minecraft:item.bucket.empty_lava", 214}, + {"minecraft:item.bucket.empty_powder_snow", 215}, + {"minecraft:item.bucket.empty_tadpole", 216}, + {"minecraft:item.bucket.fill", 217}, + {"minecraft:item.bucket.fill_axolotl", 218}, + {"minecraft:item.bucket.fill_fish", 219}, + {"minecraft:item.bucket.fill_lava", 220}, + {"minecraft:item.bucket.fill_powder_snow", 221}, + {"minecraft:item.bucket.fill_tadpole", 222}, + {"minecraft:item.bundle.drop_contents", 223}, + {"minecraft:item.bundle.insert", 224}, + {"minecraft:item.bundle.insert_fail", 225}, + {"minecraft:item.bundle.remove_one", 226}, + {"minecraft:item.chorus_fruit.teleport", 323}, + {"minecraft:item.crop.plant", 399}, + {"minecraft:item.crossbow.hit", 400}, + {"minecraft:item.crossbow.loading_end", 401}, + {"minecraft:item.crossbow.loading_middle", 402}, + {"minecraft:item.crossbow.loading_start", 403}, + {"minecraft:item.crossbow.quick_charge_1", 404}, + {"minecraft:item.crossbow.quick_charge_2", 405}, + {"minecraft:item.crossbow.quick_charge_3", 406}, + {"minecraft:item.crossbow.shoot", 407}, + {"minecraft:item.dye.use", 478}, + {"minecraft:item.elytra.flying", 488}, + {"minecraft:item.firecharge.use", 533}, + {"minecraft:item.flintandsteel.use", 549}, + {"minecraft:item.glow_ink_sac.use", 628}, + {"minecraft:item.goat_horn.sound.0", 734}, + {"minecraft:item.goat_horn.sound.1", 735}, + {"minecraft:item.goat_horn.sound.2", 736}, + {"minecraft:item.goat_horn.sound.3", 737}, + {"minecraft:item.goat_horn.sound.4", 738}, + {"minecraft:item.goat_horn.sound.5", 739}, + {"minecraft:item.goat_horn.sound.6", 740}, + {"minecraft:item.goat_horn.sound.7", 741}, + {"minecraft:item.hoe.till", 717}, + {"minecraft:item.honey_bottle.drink", 733}, + {"minecraft:item.honeycomb.wax_on", 732}, + {"minecraft:item.ink_sac.use", 773}, + {"minecraft:item.lodestone_compass.lock", 837}, + {"minecraft:item.mace.smash_air", 838}, + {"minecraft:item.mace.smash_ground", 839}, + {"minecraft:item.mace.smash_ground_heavy", 840}, + {"minecraft:item.nether_wart.plant", 962}, + {"minecraft:item.ominous_bottle.dispose", 1049}, + {"minecraft:item.shield.block", 1273}, + {"minecraft:item.shield.break", 1274}, + {"minecraft:item.shovel.flatten", 1280}, + {"minecraft:item.spyglass.stop_using", 1412}, + {"minecraft:item.spyglass.use", 1411}, + {"minecraft:item.totem.use", 1439}, + {"minecraft:item.trident.hit", 1440}, + {"minecraft:item.trident.hit_ground", 1441}, + {"minecraft:item.trident.return", 1442}, + {"minecraft:item.trident.riptide_1", 1443}, + {"minecraft:item.trident.riptide_2", 1444}, + {"minecraft:item.trident.riptide_3", 1445}, + {"minecraft:item.trident.throw", 1446}, + {"minecraft:item.trident.thunder", 1447}, + {"minecraft:item.wolf_armor.break", 1604}, + {"minecraft:item.wolf_armor.crack", 1605}, + {"minecraft:item.wolf_armor.damage", 1606}, + {"minecraft:item.wolf_armor.repair", 1607}, + {"minecraft:music.creative", 906}, + {"minecraft:music.credits", 907}, + {"minecraft:music.dragon", 927}, + {"minecraft:music.end", 928}, + {"minecraft:music.game", 929}, + {"minecraft:music.menu", 930}, + {"minecraft:music.nether.basalt_deltas", 931}, + {"minecraft:music.nether.crimson_forest", 932}, + {"minecraft:music.nether.nether_wastes", 943}, + {"minecraft:music.nether.soul_sand_valley", 946}, + {"minecraft:music.nether.warped_forest", 948}, + {"minecraft:music.overworld.badlands", 951}, + {"minecraft:music.overworld.bamboo_jungle", 954}, + {"minecraft:music.overworld.cherry_grove", 942}, + {"minecraft:music.overworld.deep_dark", 933}, + {"minecraft:music.overworld.desert", 950}, + {"minecraft:music.overworld.dripstone_caves", 934}, + {"minecraft:music.overworld.flower_forest", 949}, + {"minecraft:music.overworld.forest", 939}, + {"minecraft:music.overworld.frozen_peaks", 944}, + {"minecraft:music.overworld.grove", 935}, + {"minecraft:music.overworld.jagged_peaks", 936}, + {"minecraft:music.overworld.jungle", 952}, + {"minecraft:music.overworld.lush_caves", 937}, + {"minecraft:music.overworld.meadow", 941}, + {"minecraft:music.overworld.old_growth_taiga", 940}, + {"minecraft:music.overworld.snowy_slopes", 945}, + {"minecraft:music.overworld.sparse_jungle", 953}, + {"minecraft:music.overworld.stony_peaks", 947}, + {"minecraft:music.overworld.swamp", 938}, + {"minecraft:music.under_water", 955}, + {"minecraft:music_disc.11", 909}, + {"minecraft:music_disc.13", 910}, + {"minecraft:music_disc.5", 908}, + {"minecraft:music_disc.blocks", 911}, + {"minecraft:music_disc.cat", 912}, + {"minecraft:music_disc.chirp", 913}, + {"minecraft:music_disc.creator", 924}, + {"minecraft:music_disc.creator_music_box", 925}, + {"minecraft:music_disc.far", 914}, + {"minecraft:music_disc.mall", 915}, + {"minecraft:music_disc.mellohi", 916}, + {"minecraft:music_disc.otherside", 922}, + {"minecraft:music_disc.pigstep", 917}, + {"minecraft:music_disc.precipice", 926}, + {"minecraft:music_disc.relic", 923}, + {"minecraft:music_disc.stal", 918}, + {"minecraft:music_disc.strad", 919}, + {"minecraft:music_disc.wait", 920}, + {"minecraft:music_disc.ward", 921}, + {"minecraft:particle.soul_escape", 1338}, + {"minecraft:ui.button.click", 1483}, + {"minecraft:ui.cartography_table.take_result", 1486}, + {"minecraft:ui.hud.bubble_pop", 210}, + {"minecraft:ui.loom.select_pattern", 1484}, + {"minecraft:ui.loom.take_result", 1485}, + {"minecraft:ui.stonecutter.select_recipe", 1488}, + {"minecraft:ui.stonecutter.take_result", 1487}, + {"minecraft:ui.toast.challenge_complete", 1489}, + {"minecraft:ui.toast.in", 1490}, + {"minecraft:ui.toast.out", 1491}, + {"minecraft:weather.rain", 1573}, + {"minecraft:weather.rain.above", 1574}, + }}, + {"minecraft:spawn_condition_type", + { + {"minecraft:biome", 2}, + {"minecraft:moon_brightness", 1}, + {"minecraft:structure", 0}, + }}, + {"minecraft:stat_type", + { + {"minecraft:broken", 3}, + {"minecraft:crafted", 1}, + {"minecraft:custom", 8}, + {"minecraft:dropped", 5}, + {"minecraft:killed", 6}, + {"minecraft:killed_by", 7}, + {"minecraft:mined", 0}, + {"minecraft:picked_up", 4}, + {"minecraft:used", 2}, + }}, + {"minecraft:test_environment_definition_type", + { + {"minecraft:all_of", 0}, + {"minecraft:function", 4}, + {"minecraft:game_rules", 1}, + {"minecraft:time_of_day", 2}, + {"minecraft:weather", 3}, + }}, + {"minecraft:test_function", + { + {"minecraft:always_pass", 0}, + }}, + {"minecraft:test_instance_type", + { + {"minecraft:block_based", 0}, + {"minecraft:function", 1}, + }}, + {"minecraft:ticket_type", + { + {"minecraft:dragon", 1}, + {"minecraft:ender_pearl", 6}, + {"minecraft:forced", 4}, + {"minecraft:player_loading", 2}, + {"minecraft:player_simulation", 3}, + {"minecraft:portal", 5}, + {"minecraft:start", 0}, + {"minecraft:unknown", 7}, + }}, + {"minecraft:trigger_type", + { + {"minecraft:allay_drop_item_on_block", 51}, + {"minecraft:any_block_use", 40}, + {"minecraft:avoid_vibration", 52}, + {"minecraft:bee_nest_destroyed", 36}, + {"minecraft:bred_animals", 14}, + {"minecraft:brewed_potion", 10}, + {"minecraft:changed_dimension", 21}, + {"minecraft:channeled_lightning", 30}, + {"minecraft:construct_beacon", 11}, + {"minecraft:consume_item", 25}, + {"minecraft:crafter_recipe_crafted", 54}, + {"minecraft:cured_zombie_villager", 17}, + {"minecraft:default_block_use", 39}, + {"minecraft:effects_changed", 26}, + {"minecraft:enchanted_item", 8}, + {"minecraft:enter_block", 3}, + {"minecraft:entity_hurt_player", 7}, + {"minecraft:entity_killed_player", 2}, + {"minecraft:fall_after_explosion", 55}, + {"minecraft:fall_from_height", 48}, + {"minecraft:filled_bucket", 9}, + {"minecraft:fishing_rod_hooked", 29}, + {"minecraft:hero_of_the_village", 33}, + {"minecraft:impossible", 0}, + {"minecraft:inventory_changed", 4}, + {"minecraft:item_durability_changed", 19}, + {"minecraft:item_used_on_block", 38}, + {"minecraft:kill_mob_near_sculk_catalyst", 50}, + {"minecraft:killed_by_arrow", 32}, + {"minecraft:levitation", 20}, + {"minecraft:lightning_strike", 46}, + {"minecraft:location", 15}, + {"minecraft:nether_travel", 28}, + {"minecraft:placed_block", 24}, + {"minecraft:player_generates_container_loot", 41}, + {"minecraft:player_hurt_entity", 6}, + {"minecraft:player_interacted_with_entity", 44}, + {"minecraft:player_killed_entity", 1}, + {"minecraft:recipe_crafted", 53}, + {"minecraft:recipe_unlocked", 5}, + {"minecraft:ride_entity_in_lava", 49}, + {"minecraft:shot_crossbow", 31}, + {"minecraft:slept_in_bed", 16}, + {"minecraft:slide_down_block", 35}, + {"minecraft:started_riding", 45}, + {"minecraft:summoned_entity", 13}, + {"minecraft:tame_animal", 23}, + {"minecraft:target_hit", 37}, + {"minecraft:thrown_item_picked_up_by_entity", 42}, + {"minecraft:thrown_item_picked_up_by_player", 43}, + {"minecraft:tick", 22}, + {"minecraft:used_ender_eye", 12}, + {"minecraft:used_totem", 27}, + {"minecraft:using_item", 47}, + {"minecraft:villager_trade", 18}, + {"minecraft:voluntary_exile", 34}, + }}, + {"minecraft:villager_profession", + { + {"minecraft:armorer", 1}, + {"minecraft:butcher", 2}, + {"minecraft:cartographer", 3}, + {"minecraft:cleric", 4}, + {"minecraft:farmer", 5}, + {"minecraft:fisherman", 6}, + {"minecraft:fletcher", 7}, + {"minecraft:leatherworker", 8}, + {"minecraft:librarian", 9}, + {"minecraft:mason", 10}, + {"minecraft:nitwit", 11}, + {"minecraft:none", 0}, + {"minecraft:shepherd", 12}, + {"minecraft:toolsmith", 13}, + {"minecraft:weaponsmith", 14}, + }}, + {"minecraft:villager_type", + { + {"minecraft:desert", 0}, + {"minecraft:jungle", 1}, + {"minecraft:plains", 2}, + {"minecraft:savanna", 3}, + {"minecraft:snow", 4}, + {"minecraft:swamp", 5}, + {"minecraft:taiga", 6}, + }}, + {"minecraft:worldgen/biome_source", + { + {"minecraft:checkerboard", 2}, + {"minecraft:fixed", 0}, + {"minecraft:multi_noise", 1}, + {"minecraft:the_end", 3}, + }}, + {"minecraft:worldgen/block_state_provider_type", + { + {"minecraft:dual_noise_provider", 4}, + {"minecraft:noise_provider", 3}, + {"minecraft:noise_threshold_provider", 2}, + {"minecraft:randomized_int_state_provider", 6}, + {"minecraft:rotated_block_provider", 5}, + {"minecraft:simple_state_provider", 0}, + {"minecraft:weighted_state_provider", 1}, + }}, + {"minecraft:worldgen/carver", + { + {"minecraft:canyon", 2}, + {"minecraft:cave", 0}, + {"minecraft:nether_cave", 1}, + }}, + {"minecraft:worldgen/chunk_generator", + { + {"minecraft:debug", 2}, + {"minecraft:flat", 1}, + {"minecraft:noise", 0}, + }}, + {"minecraft:worldgen/density_function_type", + { + {"minecraft:abs", 19}, + {"minecraft:add", 25}, + {"minecraft:beardifier", 2}, + {"minecraft:blend_alpha", 0}, + {"minecraft:blend_density", 17}, + {"minecraft:blend_offset", 1}, + {"minecraft:cache_2d", 6}, + {"minecraft:cache_all_in_cell", 8}, + {"minecraft:cache_once", 7}, + {"minecraft:clamp", 18}, + {"minecraft:constant", 30}, + {"minecraft:cube", 21}, + {"minecraft:end_islands", 10}, + {"minecraft:flat_cache", 5}, + {"minecraft:half_negative", 22}, + {"minecraft:interpolated", 4}, + {"minecraft:max", 28}, + {"minecraft:min", 27}, + {"minecraft:mul", 26}, + {"minecraft:noise", 9}, + {"minecraft:old_blended_noise", 3}, + {"minecraft:quarter_negative", 23}, + {"minecraft:range_choice", 13}, + {"minecraft:shift", 16}, + {"minecraft:shift_a", 14}, + {"minecraft:shift_b", 15}, + {"minecraft:shifted_noise", 12}, + {"minecraft:spline", 29}, + {"minecraft:square", 20}, + {"minecraft:squeeze", 24}, + {"minecraft:weird_scaled_sampler", 11}, + {"minecraft:y_clamped_gradient", 31}, + }}, + {"minecraft:worldgen/feature", + { + {"minecraft:bamboo", 43}, + {"minecraft:basalt_columns", 48}, + {"minecraft:basalt_pillar", 53}, + {"minecraft:block_column", 19}, + {"minecraft:block_pile", 6}, + {"minecraft:blue_ice", 26}, + {"minecraft:bonus_chest", 52}, + {"minecraft:chorus_plant", 8}, + {"minecraft:coral_claw", 40}, + {"minecraft:coral_mushroom", 39}, + {"minecraft:coral_tree", 38}, + {"minecraft:delta_feature", 49}, + {"minecraft:desert_well", 11}, + {"minecraft:disk", 29}, + {"minecraft:dripstone_cluster", 59}, + {"minecraft:end_gateway", 35}, + {"minecraft:end_island", 34}, + {"minecraft:end_platform", 32}, + {"minecraft:end_spike", 33}, + {"minecraft:fallen_tree", 2}, + {"minecraft:fill_layer", 51}, + {"minecraft:flower", 3}, + {"minecraft:forest_rock", 28}, + {"minecraft:fossil", 12}, + {"minecraft:freeze_top_layer", 17}, + {"minecraft:geode", 58}, + {"minecraft:glowstone_blob", 16}, + {"minecraft:huge_brown_mushroom", 14}, + {"minecraft:huge_fungus", 44}, + {"minecraft:huge_red_mushroom", 13}, + {"minecraft:ice_spike", 15}, + {"minecraft:iceberg", 27}, + {"minecraft:kelp", 37}, + {"minecraft:lake", 30}, + {"minecraft:large_dripstone", 60}, + {"minecraft:monster_room", 25}, + {"minecraft:multiface_growth", 23}, + {"minecraft:nether_forest_vegetation", 45}, + {"minecraft:netherrack_replace_blobs", 50}, + {"minecraft:no_bonemeal_flower", 4}, + {"minecraft:no_op", 0}, + {"minecraft:ore", 31}, + {"minecraft:pointed_dripstone", 61}, + {"minecraft:random_boolean_selector", 57}, + {"minecraft:random_patch", 5}, + {"minecraft:random_selector", 55}, + {"minecraft:replace_single_block", 9}, + {"minecraft:root_system", 22}, + {"minecraft:scattered_ore", 54}, + {"minecraft:sculk_patch", 62}, + {"minecraft:sea_pickle", 41}, + {"minecraft:seagrass", 36}, + {"minecraft:simple_block", 42}, + {"minecraft:simple_random_selector", 56}, + {"minecraft:spring_feature", 7}, + {"minecraft:tree", 1}, + {"minecraft:twisting_vines", 47}, + {"minecraft:underwater_magma", 24}, + {"minecraft:vegetation_patch", 20}, + {"minecraft:vines", 18}, + {"minecraft:void_start_platform", 10}, + {"minecraft:waterlogged_vegetation_patch", 21}, + {"minecraft:weeping_vines", 46}, + }}, + {"minecraft:worldgen/feature_size_type", + { + {"minecraft:three_layers_feature_size", 1}, + {"minecraft:two_layers_feature_size", 0}, + }}, + {"minecraft:worldgen/foliage_placer_type", + { + {"minecraft:acacia_foliage_placer", 3}, + {"minecraft:blob_foliage_placer", 0}, + {"minecraft:bush_foliage_placer", 4}, + {"minecraft:cherry_foliage_placer", 10}, + {"minecraft:dark_oak_foliage_placer", 8}, + {"minecraft:fancy_foliage_placer", 5}, + {"minecraft:jungle_foliage_placer", 6}, + {"minecraft:mega_pine_foliage_placer", 7}, + {"minecraft:pine_foliage_placer", 2}, + {"minecraft:random_spread_foliage_placer", 9}, + {"minecraft:spruce_foliage_placer", 1}, + }}, + {"minecraft:worldgen/material_condition", + { + {"minecraft:above_preliminary_surface", 9}, + {"minecraft:biome", 0}, + {"minecraft:hole", 8}, + {"minecraft:noise_threshold", 1}, + {"minecraft:not", 7}, + {"minecraft:steep", 6}, + {"minecraft:stone_depth", 10}, + {"minecraft:temperature", 5}, + {"minecraft:vertical_gradient", 2}, + {"minecraft:water", 4}, + {"minecraft:y_above", 3}, + }}, + {"minecraft:worldgen/material_rule", + { + {"minecraft:bandlands", 0}, + {"minecraft:block", 1}, + {"minecraft:condition", 3}, + {"minecraft:sequence", 2}, + }}, + {"minecraft:worldgen/placement_modifier_type", + { + {"minecraft:biome", 4}, + {"minecraft:block_predicate_filter", 0}, + {"minecraft:count", 5}, + {"minecraft:count_on_every_layer", 8}, + {"minecraft:environment_scan", 9}, + {"minecraft:fixed_placement", 14}, + {"minecraft:height_range", 11}, + {"minecraft:heightmap", 10}, + {"minecraft:in_square", 12}, + {"minecraft:noise_based_count", 6}, + {"minecraft:noise_threshold_count", 7}, + {"minecraft:random_offset", 13}, + {"minecraft:rarity_filter", 1}, + {"minecraft:surface_relative_threshold_filter", 2}, + {"minecraft:surface_water_depth_filter", 3}, + }}, + {"minecraft:worldgen/pool_alias_binding", + { + {"minecraft:direct", 2}, + {"minecraft:random", 0}, + {"minecraft:random_group", 1}, + }}, + {"minecraft:worldgen/root_placer_type", + { + {"minecraft:mangrove_root_placer", 0}, + }}, + {"minecraft:worldgen/structure_piece", + { + {"minecraft:btp", 52}, {"minecraft:ecp", 50}, {"minecraft:iglu", 34}, {"minecraft:jigsaw", 55}, + {"minecraft:mscorridor", 0}, {"minecraft:mscrossing", 1}, {"minecraft:msroom", 2}, {"minecraft:msstairs", 3}, + {"minecraft:nebcr", 4}, {"minecraft:nebef", 5}, {"minecraft:nebs", 6}, {"minecraft:neccs", 7}, + {"minecraft:nece", 9}, {"minecraft:necsr", 14}, {"minecraft:nectb", 8}, {"minecraft:nefos", 54}, + {"minecraft:nemt", 15}, {"minecraft:nerc", 16}, {"minecraft:nesc", 12}, {"minecraft:nesclt", 11}, + {"minecraft:nescrt", 13}, {"minecraft:nescsc", 10}, {"minecraft:nesr", 17}, {"minecraft:nestart", 18}, + {"minecraft:omb", 38}, {"minecraft:omcr", 39}, {"minecraft:omdxr", 40}, {"minecraft:omdxyr", 41}, + {"minecraft:omdyr", 42}, {"minecraft:omdyzr", 43}, {"minecraft:omdzr", 44}, {"minecraft:omentry", 45}, + {"minecraft:ompenthouse", 46}, {"minecraft:omsimple", 47}, {"minecraft:omsimplet", 48}, {"minecraft:omwr", 49}, + {"minecraft:orp", 33}, {"minecraft:rupo", 35}, {"minecraft:sh5c", 21}, {"minecraft:shcc", 19}, + {"minecraft:shfc", 20}, {"minecraft:shipwreck", 53}, {"minecraft:shli", 23}, {"minecraft:shlt", 22}, + {"minecraft:shph", 25}, {"minecraft:shpr", 24}, {"minecraft:shrc", 27}, {"minecraft:shrt", 26}, + {"minecraft:shs", 30}, {"minecraft:shsd", 28}, {"minecraft:shssd", 31}, {"minecraft:shstart", 29}, + {"minecraft:tedp", 37}, {"minecraft:tejp", 32}, {"minecraft:tesh", 36}, {"minecraft:wmp", 51}, + }}, + {"minecraft:worldgen/structure_placement", + { + {"minecraft:concentric_rings", 1}, + {"minecraft:random_spread", 0}, + }}, + {"minecraft:worldgen/structure_pool_element", + { + {"minecraft:empty_pool_element", 3}, + {"minecraft:feature_pool_element", 2}, + {"minecraft:legacy_single_pool_element", 4}, + {"minecraft:list_pool_element", 1}, + {"minecraft:single_pool_element", 0}, + }}, + {"minecraft:worldgen/structure_processor", + { + {"minecraft:blackstone_replace", 7}, + {"minecraft:block_age", 6}, + {"minecraft:block_ignore", 0}, + {"minecraft:block_rot", 1}, + {"minecraft:capped", 10}, + {"minecraft:gravity", 2}, + {"minecraft:jigsaw_replacement", 3}, + {"minecraft:lava_submerged_block", 8}, + {"minecraft:nop", 5}, + {"minecraft:protected_blocks", 9}, + {"minecraft:rule", 4}, + }}, + {"minecraft:worldgen/structure_type", + { + {"minecraft:buried_treasure", 0}, + {"minecraft:desert_pyramid", 1}, + {"minecraft:end_city", 2}, + {"minecraft:fortress", 3}, + {"minecraft:igloo", 4}, + {"minecraft:jigsaw", 5}, + {"minecraft:jungle_temple", 6}, + {"minecraft:mineshaft", 7}, + {"minecraft:nether_fossil", 8}, + {"minecraft:ocean_monument", 9}, + {"minecraft:ocean_ruin", 10}, + {"minecraft:ruined_portal", 11}, + {"minecraft:shipwreck", 12}, + {"minecraft:stronghold", 13}, + {"minecraft:swamp_hut", 14}, + {"minecraft:woodland_mansion", 15}, + }}, + {"minecraft:worldgen/tree_decorator_type", + { + {"minecraft:alter_ground", 6}, + {"minecraft:attached_to_leaves", 7}, + {"minecraft:attached_to_logs", 9}, + {"minecraft:beehive", 5}, + {"minecraft:cocoa", 4}, + {"minecraft:creaking_heart", 3}, + {"minecraft:leave_vine", 1}, + {"minecraft:pale_moss", 2}, + {"minecraft:place_on_ground", 8}, + {"minecraft:trunk_vine", 0}, + }}, + {"minecraft:worldgen/trunk_placer_type", + { + {"minecraft:bending_trunk_placer", 6}, + {"minecraft:cherry_trunk_placer", 8}, + {"minecraft:dark_oak_trunk_placer", 4}, + {"minecraft:fancy_trunk_placer", 5}, + {"minecraft:forking_trunk_placer", 1}, + {"minecraft:giant_trunk_placer", 2}, + {"minecraft:mega_jungle_trunk_placer", 3}, + {"minecraft:straight_trunk_placer", 0}, + {"minecraft:upwards_branching_trunk_placer", 7}, + }}, + }; + + auto registryIt = allRegistries.find(registryType); + if (registryIt != allRegistries.end()) { + auto entryIt = registryIt->second.find(entryName); + if (entryIt != registryIt->second.end()) { + return entryIt->second; + } + } + return 0; // Return 0 for not found + } + + static std::vector getAvailableRegistries() { + return { + "minecraft:activity", + "minecraft:attribute", + "minecraft:block", + "minecraft:block_entity_type", + "minecraft:block_predicate_type", + "minecraft:block_type", + "minecraft:chunk_status", + "minecraft:command_argument_type", + "minecraft:consume_effect_type", + "minecraft:creative_mode_tab", + "minecraft:custom_stat", + "minecraft:data_component_predicate_type", + "minecraft:data_component_type", + "minecraft:decorated_pot_pattern", + "minecraft:enchantment_effect_component_type", + "minecraft:enchantment_entity_effect_type", + "minecraft:enchantment_level_based_value_type", + "minecraft:enchantment_location_based_effect_type", + "minecraft:enchantment_provider_type", + "minecraft:enchantment_value_effect_type", + "minecraft:entity_sub_predicate_type", + "minecraft:entity_type", + "minecraft:float_provider_type", + "minecraft:fluid", + "minecraft:game_event", + "minecraft:height_provider_type", + "minecraft:int_provider_type", + "minecraft:item", + "minecraft:loot_condition_type", + "minecraft:loot_function_type", + "minecraft:loot_nbt_provider_type", + "minecraft:loot_number_provider_type", + "minecraft:loot_pool_entry_type", + "minecraft:loot_score_provider_type", + "minecraft:map_decoration_type", + "minecraft:memory_module_type", + "minecraft:menu", + "minecraft:mob_effect", + "minecraft:number_format_type", + "minecraft:particle_type", + "minecraft:point_of_interest_type", + "minecraft:pos_rule_test", + "minecraft:position_source_type", + "minecraft:potion", + "minecraft:recipe_book_category", + "minecraft:recipe_display", + "minecraft:recipe_serializer", + "minecraft:recipe_type", + "minecraft:rule_block_entity_modifier", + "minecraft:rule_test", + "minecraft:schedule", + "minecraft:sensor_type", + "minecraft:slot_display", + "minecraft:sound_event", + "minecraft:spawn_condition_type", + "minecraft:stat_type", + "minecraft:test_environment_definition_type", + "minecraft:test_function", + "minecraft:test_instance_type", + "minecraft:ticket_type", + "minecraft:trigger_type", + "minecraft:villager_profession", + "minecraft:villager_type", + "minecraft:worldgen/biome_source", + "minecraft:worldgen/block_state_provider_type", + "minecraft:worldgen/carver", + "minecraft:worldgen/chunk_generator", + "minecraft:worldgen/density_function_type", + "minecraft:worldgen/feature", + "minecraft:worldgen/feature_size_type", + "minecraft:worldgen/foliage_placer_type", + "minecraft:worldgen/material_condition", + "minecraft:worldgen/material_rule", + "minecraft:worldgen/placement_modifier_type", + "minecraft:worldgen/pool_alias_binding", + "minecraft:worldgen/root_placer_type", + "minecraft:worldgen/structure_piece", + "minecraft:worldgen/structure_placement", + "minecraft:worldgen/structure_pool_element", + "minecraft:worldgen/structure_processor", + "minecraft:worldgen/structure_type", + "minecraft:worldgen/tree_decorator_type", + "minecraft:worldgen/trunk_placer_type", + }; + } +}; + +#endif // REGISTRY_IDS_HPP diff --git a/include/data/TagUtils.hpp b/include/data/TagUtils.hpp new file mode 100644 index 0000000..ff1698c --- /dev/null +++ b/include/data/TagUtils.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include "RegistriesTag.hpp" + +#include +#include +#include + +class TagUtils { + public: + static std::optional> getTagsForRegistry(const std::string& registryName); + + static std::optional getTag(const std::string& registryName, const std::string& tagName); + + static bool hasTag(const std::string& registryName, const std::string& tagName); + + static bool isInTag(const std::string& registryName, const std::string& tagName, int entryId); + + static std::vector getAllRegistryNames(); + + static size_t getTotalTagCount(); + + static size_t getTagCountForRegistry(const std::string& registryName); + + static std::vector getEntriesForTag(const std::string& registryName, const std::string& tagName); + + static void logTagStatistics(); +}; diff --git a/include/data/minecraftRegistries.hpp b/include/data/minecraftRegistries.hpp new file mode 100644 index 0000000..b614b69 --- /dev/null +++ b/include/data/minecraftRegistries.hpp @@ -0,0 +1,430 @@ +#pragma once +// Minecraft Registry Data +// Generated automatically - do not modify + +#include +#include +#include + +struct RegistryEntry { + std::string name; + int protocol_id; +}; + +struct Registry { + std::vector entries; + int protocol_id; +}; + +// Complete list of registries +const std::vector REGISTRY_LIST = { + "minecraft:banner_pattern", "minecraft:cat_variant", "minecraft:chat_type", "minecraft:chicken_variant", + "minecraft:cow_variant", "minecraft:damage_type", "minecraft:dimension_type", "minecraft:enchantment", + "minecraft:frog_variant", "minecraft:instrument", "minecraft:jukebox_song", "minecraft:painting_variant", + "minecraft:pig_variant", "minecraft:test_environment", "minecraft:test_instance", "minecraft:trim_material", + "minecraft:trim_pattern", "minecraft:wolf_sound_variant", "minecraft:wolf_variant", "minecraft:worldgen/biome"}; + +const std::unordered_map REGISTRIES = { + {"minecraft:worldgen/biome", + {{{"minecraft:nether_wastes", 0}, + {"minecraft:end_midlands", 1}, + {"minecraft:taiga", 2}, + {"minecraft:old_growth_spruce_taiga", 3}, + {"minecraft:the_void", 4}, + {"minecraft:sunflower_plains", 5}, + {"minecraft:end_barrens", 6}, + {"minecraft:snowy_taiga", 7}, + {"minecraft:old_growth_pine_taiga", 8}, + {"minecraft:soul_sand_valley", 9}, + {"minecraft:crimson_forest", 10}, + {"minecraft:wooded_badlands", 11}, + {"minecraft:snowy_plains", 12}, + {"minecraft:deep_frozen_ocean", 13}, + {"minecraft:mushroom_fields", 14}, + {"minecraft:bamboo_jungle", 15}, + {"minecraft:stony_peaks", 16}, + {"minecraft:deep_cold_ocean", 17}, + {"minecraft:deep_ocean", 18}, + {"minecraft:stony_shore", 19}, + {"minecraft:windswept_hills", 20}, + {"minecraft:windswept_savanna", 21}, + {"minecraft:frozen_ocean", 22}, + {"minecraft:dark_forest", 23}, + {"minecraft:frozen_peaks", 24}, + {"minecraft:cold_ocean", 25}, + {"minecraft:beach", 26}, + {"minecraft:old_growth_birch_forest", 27}, + {"minecraft:warm_ocean", 28}, + {"minecraft:jagged_peaks", 29}, + {"minecraft:cherry_grove", 30}, + {"minecraft:forest", 31}, + {"minecraft:river", 32}, + {"minecraft:snowy_beach", 33}, + {"minecraft:warped_forest", 34}, + {"minecraft:badlands", 35}, + {"minecraft:meadow", 36}, + {"minecraft:eroded_badlands", 37}, + {"minecraft:lush_caves", 38}, + {"minecraft:birch_forest", 39}, + {"minecraft:small_end_islands", 40}, + {"minecraft:windswept_forest", 41}, + {"minecraft:pale_garden", 42}, + {"minecraft:swamp", 43}, + {"minecraft:mangrove_swamp", 44}, + {"minecraft:basalt_deltas", 45}, + {"minecraft:snowy_slopes", 46}, + {"minecraft:windswept_gravelly_hills", 47}, + {"minecraft:savanna", 48}, + {"minecraft:the_end", 49}, + {"minecraft:grove", 50}, + {"minecraft:sparse_jungle", 51}, + {"minecraft:ocean", 52}, + {"minecraft:frozen_river", 53}, + {"minecraft:deep_dark", 54}, + {"minecraft:lukewarm_ocean", 55}, + {"minecraft:jungle", 56}, + {"minecraft:end_highlands", 57}, + {"minecraft:savanna_plateau", 58}, + {"minecraft:desert", 59}, + {"minecraft:ice_spikes", 60}, + {"minecraft:deep_lukewarm_ocean", 61}, + {"minecraft:flower_forest", 62}, + {"minecraft:plains", 63}, + {"minecraft:dripstone_caves", 64}}, + 0}}, + {"minecraft:chicken_variant", {{{"minecraft:temperate", 0}, {"minecraft:warm", 1}, {"minecraft:cold", 2}}, 0}}, + {"minecraft:chat_type", + {{{"minecraft:team_msg_command_outgoing", 0}, + {"minecraft:emote_command", 1}, + {"minecraft:say_command", 2}, + {"minecraft:chat", 3}, + {"minecraft:msg_command_outgoing", 4}, + {"minecraft:team_msg_command_incoming", 5}, + {"minecraft:msg_command_incoming", 6}}, + 0}}, + {"minecraft:trim_material", + {{{"minecraft:iron", 0}, + {"minecraft:netherite", 1}, + {"minecraft:gold", 2}, + {"minecraft:quartz", 3}, + {"minecraft:emerald", 4}, + {"minecraft:resin", 5}, + {"minecraft:copper", 6}, + {"minecraft:diamond", 7}, + {"minecraft:lapis", 8}, + {"minecraft:redstone", 9}, + {"minecraft:amethyst", 10}}, + 0}}, + {"minecraft:jukebox_song", + {{{"minecraft:mall", 0}, + {"minecraft:13", 1}, + {"minecraft:far", 2}, + {"minecraft:relic", 3}, + {"minecraft:pigstep", 4}, + {"minecraft:stal", 5}, + {"minecraft:ward", 6}, + {"minecraft:creator_music_box", 7}, + {"minecraft:strad", 8}, + {"minecraft:otherside", 9}, + {"minecraft:creator", 10}, + {"minecraft:chirp", 11}, + {"minecraft:precipice", 12}, + {"minecraft:cat", 13}, + {"minecraft:5", 14}, + {"minecraft:11", 15}, + {"minecraft:mellohi", 16}, + {"minecraft:wait", 17}, + {"minecraft:blocks", 18}}, + 0}}, + {"minecraft:instrument", + {{{"minecraft:feel_goat_horn", 0}, + {"minecraft:call_goat_horn", 1}, + {"minecraft:admire_goat_horn", 2}, + {"minecraft:sing_goat_horn", 3}, + {"minecraft:dream_goat_horn", 4}, + {"minecraft:ponder_goat_horn", 5}, + {"minecraft:yearn_goat_horn", 6}, + {"minecraft:seek_goat_horn", 7}}, + 0}}, + {"minecraft:painting_variant", + {{{"minecraft:sunset", 0}, + {"minecraft:prairie_ride", 1}, + {"minecraft:wasteland", 2}, + {"minecraft:stage", 3}, + {"minecraft:wanderer", 4}, + {"minecraft:fighters", 5}, + {"minecraft:unpacked", 6}, + {"minecraft:kebab", 7}, + {"minecraft:courbet", 8}, + {"minecraft:orb", 9}, + {"minecraft:pointer", 10}, + {"minecraft:pigscene", 11}, + {"minecraft:cotan", 12}, + {"minecraft:fire", 13}, + {"minecraft:aztec2", 14}, + {"minecraft:sunflowers", 15}, + {"minecraft:meditative", 16}, + {"minecraft:void", 17}, + {"minecraft:alban", 18}, + {"minecraft:finding", 19}, + {"minecraft:passage", 20}, + {"minecraft:owlemons", 21}, + {"minecraft:earth", 22}, + {"minecraft:match", 23}, + {"minecraft:wind", 24}, + {"minecraft:plant", 25}, + {"minecraft:tides", 26}, + {"minecraft:cavebird", 27}, + {"minecraft:lowmist", 28}, + {"minecraft:backyard", 29}, + {"minecraft:humble", 30}, + {"minecraft:wither", 31}, + {"minecraft:sea", 32}, + {"minecraft:fern", 33}, + {"minecraft:changing", 34}, + {"minecraft:graham", 35}, + {"minecraft:burning_skull", 36}, + {"minecraft:bouquet", 37}, + {"minecraft:creebet", 38}, + {"minecraft:baroque", 39}, + {"minecraft:endboss", 40}, + {"minecraft:pool", 41}, + {"minecraft:donkey_kong", 42}, + {"minecraft:pond", 43}, + {"minecraft:skull_and_roses", 44}, + {"minecraft:aztec", 45}, + {"minecraft:skeleton", 46}, + {"minecraft:bust", 47}, + {"minecraft:bomb", 48}, + {"minecraft:water", 49}}, + 0}}, + {"minecraft:cow_variant", {{{"minecraft:temperate", 0}, {"minecraft:warm", 1}, {"minecraft:cold", 2}}, 0}}, + {"minecraft:damage_type", + {{{"minecraft:sting", 0}, + {"minecraft:fly_into_wall", 1}, + {"minecraft:stalagmite", 2}, + {"minecraft:sweet_berry_bush", 3}, + {"minecraft:thrown", 4}, + {"minecraft:player_attack", 5}, + {"minecraft:outside_border", 6}, + {"minecraft:magic", 7}, + {"minecraft:unattributed_fireball", 8}, + {"minecraft:arrow", 9}, + {"minecraft:falling_block", 10}, + {"minecraft:wither_skull", 11}, + {"minecraft:lightning_bolt", 12}, + {"minecraft:player_explosion", 13}, + {"minecraft:falling_anvil", 14}, + {"minecraft:spit", 15}, + {"minecraft:lava", 16}, + {"minecraft:explosion", 17}, + {"minecraft:campfire", 18}, + {"minecraft:mob_attack_no_aggro", 19}, + {"minecraft:fireball", 20}, + {"minecraft:mace_smash", 21}, + {"minecraft:in_wall", 22}, + {"minecraft:freeze", 23}, + {"minecraft:wither", 24}, + {"minecraft:mob_attack", 25}, + {"minecraft:mob_projectile", 26}, + {"minecraft:dragon_breath", 27}, + {"minecraft:generic_kill", 28}, + {"minecraft:generic", 29}, + {"minecraft:indirect_magic", 30}, + {"minecraft:thorns", 31}, + {"minecraft:cramming", 32}, + {"minecraft:bad_respawn_point", 33}, + {"minecraft:in_fire", 34}, + {"minecraft:drown", 35}, + {"minecraft:fireworks", 36}, + {"minecraft:sonic_boom", 37}, + {"minecraft:ender_pearl", 38}, + {"minecraft:on_fire", 39}, + {"minecraft:fall", 40}, + {"minecraft:falling_stalactite", 41}, + {"minecraft:hot_floor", 42}, + {"minecraft:trident", 43}, + {"minecraft:starve", 44}, + {"minecraft:cactus", 45}, + {"minecraft:wind_charge", 46}, + {"minecraft:dry_out", 47}, + {"minecraft:out_of_world", 48}}, + 0}}, + {"minecraft:test_environment", {{{"minecraft:default", 0}}, 0}}, + {"minecraft:cat_variant", + {{{"minecraft:white", 0}, + {"minecraft:siamese", 1}, + {"minecraft:tabby", 2}, + {"minecraft:ragdoll", 3}, + {"minecraft:black", 4}, + {"minecraft:all_black", 5}, + {"minecraft:persian", 6}, + {"minecraft:calico", 7}, + {"minecraft:british_shorthair", 8}, + {"minecraft:jellie", 9}, + {"minecraft:red", 10}}, + 0}}, + {"minecraft:trim_pattern", + {{{"minecraft:eye", 0}, + {"minecraft:spire", 1}, + {"minecraft:silence", 2}, + {"minecraft:snout", 3}, + {"minecraft:ward", 4}, + {"minecraft:host", 5}, + {"minecraft:dune", 6}, + {"minecraft:rib", 7}, + {"minecraft:bolt", 8}, + {"minecraft:wayfinder", 9}, + {"minecraft:shaper", 10}, + {"minecraft:raiser", 11}, + {"minecraft:wild", 12}, + {"minecraft:flow", 13}, + {"minecraft:tide", 14}, + {"minecraft:vex", 15}, + {"minecraft:sentry", 16}, + {"minecraft:coast", 17}}, + 0}}, + {"minecraft:enchantment", + {{{"minecraft:riptide", 0}, + {"minecraft:smite", 1}, + {"minecraft:feather_falling", 2}, + {"minecraft:aqua_affinity", 3}, + {"minecraft:looting", 4}, + {"minecraft:soul_speed", 5}, + {"minecraft:infinity", 6}, + {"minecraft:power", 7}, + {"minecraft:fire_protection", 8}, + {"minecraft:flame", 9}, + {"minecraft:vanishing_curse", 10}, + {"minecraft:blast_protection", 11}, + {"minecraft:unbreaking", 12}, + {"minecraft:channeling", 13}, + {"minecraft:multishot", 14}, + {"minecraft:loyalty", 15}, + {"minecraft:bane_of_arthropods", 16}, + {"minecraft:sweeping_edge", 17}, + {"minecraft:knockback", 18}, + {"minecraft:impaling", 19}, + {"minecraft:swift_sneak", 20}, + {"minecraft:mending", 21}, + {"minecraft:thorns", 22}, + {"minecraft:quick_charge", 23}, + {"minecraft:frost_walker", 24}, + {"minecraft:binding_curse", 25}, + {"minecraft:lure", 26}, + {"minecraft:punch", 27}, + {"minecraft:density", 28}, + {"minecraft:piercing", 29}, + {"minecraft:wind_burst", 30}, + {"minecraft:silk_touch", 31}, + {"minecraft:efficiency", 32}, + {"minecraft:fortune", 33}, + {"minecraft:luck_of_the_sea", 34}, + {"minecraft:projectile_protection", 35}, + {"minecraft:fire_aspect", 36}, + {"minecraft:protection", 37}, + {"minecraft:sharpness", 38}, + {"minecraft:breach", 39}, + {"minecraft:respiration", 40}, + {"minecraft:depth_strider", 41}}, + 0}}, + {"minecraft:dimension_type", + {{{"minecraft:overworld_caves", 0}, {"minecraft:overworld", 1}, {"minecraft:the_nether", 2}, {"minecraft:the_end", 3}}, 0}}, + {"minecraft:wolf_variant", + {{{"minecraft:ashen", 0}, + {"minecraft:pale", 1}, + {"minecraft:snowy", 2}, + {"minecraft:chestnut", 3}, + {"minecraft:black", 4}, + {"minecraft:spotted", 5}, + {"minecraft:rusty", 6}, + {"minecraft:woods", 7}, + {"minecraft:striped", 8}}, + 0}}, + {"minecraft:pig_variant", {{{"minecraft:temperate", 0}, {"minecraft:warm", 1}, {"minecraft:cold", 2}}, 0}}, + {"minecraft:banner_pattern", + {{{"minecraft:stripe_top", 0}, + {"minecraft:stripe_left", 1}, + {"minecraft:diagonal_right", 2}, + {"minecraft:circle", 3}, + {"minecraft:piglin", 4}, + {"minecraft:bricks", 5}, + {"minecraft:half_horizontal_bottom", 6}, + {"minecraft:mojang", 7}, + {"minecraft:stripe_bottom", 8}, + {"minecraft:half_vertical_right", 9}, + {"minecraft:border", 10}, + {"minecraft:stripe_downright", 11}, + {"minecraft:stripe_center", 12}, + {"minecraft:triangle_bottom", 13}, + {"minecraft:diagonal_left", 14}, + {"minecraft:stripe_downleft", 15}, + {"minecraft:triangle_top", 16}, + {"minecraft:diagonal_up_right", 17}, + {"minecraft:diagonal_up_left", 18}, + {"minecraft:flower", 19}, + {"minecraft:cross", 20}, + {"minecraft:square_bottom_right", 21}, + {"minecraft:globe", 22}, + {"minecraft:triangles_bottom", 23}, + {"minecraft:square_top_right", 24}, + {"minecraft:rhombus", 25}, + {"minecraft:square_bottom_left", 26}, + {"minecraft:gradient_up", 27}, + {"minecraft:triangles_top", 28}, + {"minecraft:curly_border", 29}, + {"minecraft:square_top_left", 30}, + {"minecraft:gradient", 31}, + {"minecraft:half_vertical", 32}, + {"minecraft:guster", 33}, + {"minecraft:stripe_middle", 34}, + {"minecraft:straight_cross", 35}, + {"minecraft:flow", 36}, + {"minecraft:skull", 37}, + {"minecraft:creeper", 38}, + {"minecraft:base", 39}, + {"minecraft:half_horizontal", 40}, + {"minecraft:small_stripes", 41}, + {"minecraft:stripe_right", 42}}, + 0}}, + {"minecraft:test_instance", {{{"minecraft:always_pass", 0}}, 0}}, + {"minecraft:wolf_sound_variant", + {{{"minecraft:angry", 0}, + {"minecraft:grumpy", 1}, + {"minecraft:classic", 2}, + {"minecraft:big", 3}, + {"minecraft:puglin", 4}, + {"minecraft:cute", 5}, + {"minecraft:sad", 6}}, + 0}}, + {"minecraft:frog_variant", {{{"minecraft:temperate", 0}, {"minecraft:warm", 1}, {"minecraft:cold", 2}}, 0}}}; + +// Helper functions for registries +inline const Registry* getRegistry(const std::string& name) { + auto it = REGISTRIES.find(name); + return (it != REGISTRIES.end()) ? &it->second : nullptr; +} + +inline int getEntryProtocolId(const std::string& registry, const std::string& entry) { + const Registry* reg = getRegistry(registry); + if (!reg) return -1; + + for (const auto& e : reg->entries) { + if (e.name == entry) return e.protocol_id; + } + return -1; +} + +inline std::vector getRegistryNames() { return REGISTRY_LIST; } + +inline size_t getRegistryCount() { return REGISTRY_LIST.size(); } + +inline bool hasRegistry(const std::string& name) { return REGISTRIES.find(name) != REGISTRIES.end(); } + +inline size_t getTotalEntryCount() { + size_t count = 0; + for (const auto& [name, registry] : REGISTRIES) { + count += registry.entries.size(); + } + return count; +} diff --git a/include/MD5.hpp b/include/lib/MD5.hpp similarity index 100% rename from include/MD5.hpp rename to include/lib/MD5.hpp diff --git a/include/UUID.hpp b/include/lib/UUID.hpp similarity index 73% rename from include/UUID.hpp rename to include/lib/UUID.hpp index e5599e1..cd8f823 100644 --- a/include/UUID.hpp +++ b/include/lib/UUID.hpp @@ -19,13 +19,13 @@ class UUID { uint64_t getMostSigBits() const; uint64_t getLeastSigBits() const; - void setMostSigBits(uint64_t val); - void setLeastSigBits(uint64_t val); + void setMostSigBits(uint64_t val); + void setLeastSigBits(uint64_t val); std::string toString() const; - void readFromBuffer(Buffer& buf); - void writeToBuffer(Buffer& buf) const; + void readFromBuffer(Buffer& buf); + void writeToBuffer(Buffer& buf) const; static UUID fromOfflinePlayer(const std::string& name); }; diff --git a/include/lib/filesystem.hpp b/include/lib/filesystem.hpp new file mode 100644 index 0000000..fd165e9 --- /dev/null +++ b/include/lib/filesystem.hpp @@ -0,0 +1,8 @@ +#ifndef FS_H +#define FS_H + +#include + +std::filesystem::path getPath(); + +#endif diff --git a/include/json.hpp b/include/lib/json.hpp similarity index 100% rename from include/json.hpp rename to include/lib/json.hpp diff --git a/include/nbt.hpp b/include/lib/nbt.hpp similarity index 63% rename from include/nbt.hpp rename to include/lib/nbt.hpp index 4ba4a90..11f4d22 100644 --- a/include/nbt.hpp +++ b/include/lib/nbt.hpp @@ -12,62 +12,59 @@ Compatible with older C++ compilers #endif #include -#include #include +#include #include #include #include #include #include #include -#include // Compatibility implementations for GCC 10.5 #if __cpp_lib_byteswap < 202110L namespace std { - template - constexpr T byteswap(T value) noexcept { - static_assert(std::is_integral_v, "byteswap requires integral type"); - if constexpr (sizeof(T) == 1) { - return value; - } else if constexpr (sizeof(T) == 2) { - return __builtin_bswap16(value); - } else if constexpr (sizeof(T) == 4) { - return __builtin_bswap32(value); - } else if constexpr (sizeof(T) == 8) { - return __builtin_bswap64(value); - } - } -} + template constexpr T byteswap(T value) noexcept { + static_assert(std::is_integral_v, "byteswap requires integral type"); + if constexpr (sizeof(T) == 1) { + return value; + } else if constexpr (sizeof(T) == 2) { + return __builtin_bswap16(value); + } else if constexpr (sizeof(T) == 4) { + return __builtin_bswap32(value); + } else if constexpr (sizeof(T) == 8) { + return __builtin_bswap64(value); + } + } +} // namespace std #endif #if __cpp_lib_bit_cast < 201806L namespace std { - template - constexpr To bit_cast(const From& src) noexcept { - static_assert(sizeof(To) == sizeof(From), "bit_cast requires same size types"); - static_assert(std::is_trivially_copyable_v, "bit_cast requires trivially copyable To type"); - static_assert(std::is_trivially_copyable_v, "bit_cast requires trivially copyable From type"); - To dst; - std::memcpy(&dst, &src, sizeof(To)); - return dst; - } -} + template constexpr To bit_cast(const From& src) noexcept { + static_assert(sizeof(To) == sizeof(From), "bit_cast requires same size types"); + static_assert(std::is_trivially_copyable_v, "bit_cast requires trivially copyable To type"); + static_assert(std::is_trivially_copyable_v, "bit_cast requires trivially copyable From type"); + To dst; + std::memcpy(&dst, &src, sizeof(To)); + return dst; + } +} // namespace std #endif namespace nbt { // Basic NBT types - typedef std::nullptr_t TagEnd; - typedef std::int8_t TagByte; - typedef std::int16_t TagShort; - typedef std::int32_t TagInt; - typedef std::int64_t TagLong; - typedef float TagFloat; - typedef double TagDouble; - typedef std::string TagString; + typedef std::nullptr_t TagEnd; + typedef std::int8_t TagByte; + typedef std::int16_t TagShort; + typedef std::int32_t TagInt; + typedef std::int64_t TagLong; + typedef float TagFloat; + typedef double TagDouble; + typedef std::string TagString; typedef std::vector TagByteArray; - typedef std::vector TagIntArray; + typedef std::vector TagIntArray; typedef std::vector TagLongArray; // Forward declaration for recursive types @@ -78,19 +75,19 @@ namespace nbt { // Tag variant - using struct to avoid forward declaration issues struct Tag { std::variant, - std::shared_ptr, - TagIntArray, - TagLongArray> - data; + TagByte, + TagShort, + TagInt, + TagLong, + TagFloat, + TagDouble, + TagByteArray, + TagString, + std::shared_ptr, + std::shared_ptr, + TagIntArray, + TagLongArray> + data; // Constructors Tag() : data(TagEnd{}) {} @@ -166,11 +163,11 @@ namespace nbt { }; // Helper functions for creating tags - inline TagByte createByte(std::int8_t value) { return value; } - inline TagShort createShort(std::int16_t value) { return value; } - inline TagInt createInt(std::int32_t value) { return value; } - inline TagLong createLong(std::int64_t value) { return value; } - inline TagFloat createFloat(float value) { return value; } + inline TagByte createByte(std::int8_t value) { return value; } + inline TagShort createShort(std::int16_t value) { return value; } + inline TagInt createInt(std::int32_t value) { return value; } + inline TagLong createLong(std::int64_t value) { return value; } + inline TagFloat createFloat(float value) { return value; } inline TagDouble createDouble(double value) { return value; } inline TagString createString(const std::string& value) { return value; } @@ -185,10 +182,10 @@ namespace nbt { NBT(const std::string& name) : name(name) {} NBT(const std::string& name, const TagCompound& tags) : name(name), root(tags) {} - void setName(const std::string& n) { name = n; } + void setName(const std::string& n) { name = n; } std::string getName() const { return name; } - TagCompound& getRoot() { return root; } + TagCompound& getRoot() { return root; } const TagCompound& getRoot() const { return root; } void encode(std::ostream& os) const { root.encode(os); } diff --git a/include/lib/nbtParser.hpp b/include/lib/nbtParser.hpp new file mode 100644 index 0000000..6fe258a --- /dev/null +++ b/include/lib/nbtParser.hpp @@ -0,0 +1,34 @@ +#ifndef NBT_PARSER_HPP +#define NBT_PARSER_HPP + +#include "lib/nbt.hpp" + +#include +#include +#include +#include + +namespace nbt { + + // NBT binary parser for Minecraft's Named Binary Tag format. + // This class parses a binary NBT buffer into the simplified NBT model in lib/nbt.hpp. + class Parser { + public: + Parser() = default; + + // Parse an NBT payload (binary) into an NBT object. + // Expects the data to start with a root tag type and name. + NBT parse(const std::vector& data); + + private: + // Helper utilities for decoding the binary stream (big-endian). + template T read(const std::vector& data, size_t& cursor); + std::string parseTagName(const std::vector& data, size_t& cursor); + TagCompound parseCompound(const std::vector& data, size_t& cursor); + TagList parseList(const std::vector& data, size_t& cursor); + Tag parseTag(const std::vector& data, size_t& cursor, uint8_t tagType); + }; + +} // namespace nbt + +#endif // NBT_PARSER_HPP diff --git a/include/logger.hpp b/include/logger.hpp index 9855387..fb9c778 100644 --- a/include/logger.hpp +++ b/include/logger.hpp @@ -1,6 +1,6 @@ #pragma once #ifndef LOGGER_HPP -# define LOGGER_HPP +#define LOGGER_HPP #include #include #include @@ -15,39 +15,35 @@ enum LogCategory { NETWORK, GAMEINFO }; struct LogEntry { std::chrono::system_clock::time_point timestamp; - LogLevel level; - LogCategory category; - std::string message; - std::string source; + LogLevel level; + LogCategory category; + std::string message; + std::string source; }; class LogManager { private: std::filesystem::path _logDir; - std::ofstream _networkFile; - std::ofstream _gameInfoFile; - std::queue _logQueue; - std::mutex _queueMutex; - std::mutex _fileMutex; - std::thread _writerThread; - bool _running; - + std::ofstream _networkFile; + std::ofstream _gameInfoFile; + std::queue _logQueue; + std::mutex _queueMutex; + std::mutex _fileMutex; + std::thread _writerThread; + bool _running; public: LogManager(); ~LogManager(); // Core logging methods - void log(LogLevel level, - LogCategory category, - const std::string& message, - const std::string& source = ""); + void log(LogLevel level, LogCategory category, const std::string& message, const std::string& source = ""); void logNetwork(LogLevel level, const std::string& message, const std::string& source = ""); void logGameInfo(LogLevel level, const std::string& message, const std::string& source = ""); private: - bool initializeLogDirectory(); - void writerThreadLoop(); + bool initializeLogDirectory(); + void writerThreadLoop(); std::string formatLogEntry(const LogEntry& entry); std::string getCurrentTimestamp(); std::string getDetailedTimestamp(); @@ -55,5 +51,5 @@ class LogManager { // Global logger instance extern std::unique_ptr g_logger; -void initializeGlobalLogger(); +void initializeGlobalLogger(); #endif diff --git a/include/network/buffer.hpp b/include/network/buffer.hpp new file mode 100644 index 0000000..13f8af6 --- /dev/null +++ b/include/network/buffer.hpp @@ -0,0 +1,86 @@ +#ifndef BUFFER_HPP +#define BUFFER_HPP + +#include "../lib/UUID.hpp" + +#include +#include +#include +#include +#include +#include + +class Buffer { + private: + std::vector _data; + size_t _pos; + + public: + Buffer(); + explicit Buffer(const std::vector& data); + + int readVarInt(); + void writeVarInt(int value); + void writeInt(int32_t value); + void writeIdentifierArray(const std::vector& ids); + void writeUInt(uint32_t value); + + std::string readString(int maxLength); + std::string readString(); // Read string without max length limit + void writeString(const std::string& str); + + // Array reading methods + std::vector readStringArray(); + std::vector readVarIntArray(); + template std::vector readArray(std::function reader) { + int count = readVarInt(); + if (count < 0) { + throw std::runtime_error("Negative array length"); + } + std::vector result; + result.reserve(count); + + for (int i = 0; i < count; ++i) { + result.push_back(reader()); + } + + return result; + } + + // Boolean reading methods + bool readBool(); + + std::vector& getData(); + size_t remaining() const; + uint16_t readUShort(); + void writeUShort(uint16_t value); + uint64_t readUInt64(); + long readLong(); + int32_t readInt(); + void writeLong(long value); + uint8_t readByte(); + void writeByte(uint8_t byte); + void writeBytes(const std::string& data); + void writeBytes(const std::vector& data); + void writeUUID(const UUID& uuid); + + void writeBool(bool value); + void writeNBT(const std::string& nbtData); + void writePosition(int32_t x, int32_t y, int32_t z); + void writeFloat(float value); + void writeDouble(double value); + void writeIdentifier(const std::string& id); + void writeVarLong(int64_t value); + int64_t readVarLong(); + + // Known Packs packet specific methods + struct KnownPack { + std::string nameSpace; + std::string id; + std::string version; + }; + std::vector readKnownPacks(); + void writeKnownPacks(const std::vector& packs); +}; + +#endif diff --git a/include/id_manager.hpp b/include/network/id_manager.hpp similarity index 67% rename from include/id_manager.hpp rename to include/network/id_manager.hpp index 912ceef..39ade0b 100644 --- a/include/id_manager.hpp +++ b/include/network/id_manager.hpp @@ -8,7 +8,7 @@ class IdManager { private: - uint32_t _nextId; + uint32_t _nextId; std::set _freedIds; mutable std::mutex _mutex; @@ -17,10 +17,10 @@ class IdManager { ~IdManager(); uint32_t allocate(); - void release(uint32_t id); - size_t getAllocatedCount() const; - size_t getFreedCount() const; - void reset(); + void release(uint32_t id); + size_t getAllocatedCount() const; + size_t getFreedCount() const; + void reset(); }; #endif diff --git a/include/networking.hpp b/include/network/networking.hpp similarity index 66% rename from include/networking.hpp rename to include/network/networking.hpp index e1e7bd9..21e311d 100644 --- a/include/networking.hpp +++ b/include/network/networking.hpp @@ -1,27 +1,27 @@ #ifndef NETWORKING_HPP #define NETWORKING_HPP -#include "UUID.hpp" +#include "../lib/UUID.hpp" +#include "../player.hpp" #include "packet.hpp" -#include "player.hpp" // Forward declaration to avoid circular dependency class Server; #include #include #include +#include #include #include #include #include #include #include -#include template class ThreadSafeQueue { private: - std::queue _queue; - mutable std::mutex _mutex; + std::queue _queue; + mutable std::mutex _mutex; std::condition_variable _condition; public: @@ -33,8 +33,7 @@ template class ThreadSafeQueue { bool tryPop(T& item) { std::lock_guard lock(_mutex); - if (_queue.empty()) - return false; + if (_queue.empty()) return false; item = std::move(_queue.front()); _queue.pop(); @@ -72,18 +71,18 @@ class NetworkManager { ThreadSafeQueue _outgoingPackets; std::vector _workerThreads; - std::atomic _shutdownFlag; - std::thread _receiverThread; - std::thread _senderThread; - char _receiverThreadInit; - char _senderThreadInit; - Server& _server; - int _epollFd; - int _serverSocket; + std::atomic _shutdownFlag; + std::thread _receiverThread; + std::thread _senderThread; + char _receiverThreadInit; + char _senderThreadInit; + Server& _server; + int _epollFd; + int _serverSocket; public: - NetworkManager(size_t worker_count, - Server& s); // Could use std::thread::hardware_concurrency() for the worker size; + NetworkManager(size_t worker_count, + Server& s); // Could use std::thread::hardware_concurrency() for the worker size; ~NetworkManager() { if (_epollFd != -1) { close(_epollFd); @@ -95,12 +94,11 @@ class NetworkManager { void stopThreads(); void shutdown(); - void addPlayerConnection(std::shared_ptr connection); - void removePlayerConnection(UUID id); + void addPlayerConnection(std::shared_ptr connection); + void removePlayerConnection(UUID id); + ThreadSafeQueue* getOutgoingQueue() { return &_outgoingPackets; } - Server& getServer() { - return _server; - } + Server& getServer() { return _server; } void enqueueOutgoingPacket(Packet* p); @@ -114,11 +112,11 @@ class NetworkManager { void handleIncomingData(int socket); }; -void packetRouter(Packet* packet, Server& server, ThreadSafeQueue* _outgoingPackets); +void packetRouter(Packet* packet, Server& server); void handleHandshakePacket(Packet& packet, Server& server); void handleStatusPacket(Packet& packet, Server& server); void handlePingPacket(Packet& packet, Server& server); -void handleClientInformation(Packet& packet, Server &server); +void handleClientInformation(Packet& packet, Server& server); void handleLoginStartPacket(Packet& packet, Server& server); void handleLoginAcknowledged(Packet& packet, Server& server); void handleCookieRequest(Packet& packet, Server& server); @@ -130,7 +128,7 @@ void writeSetCenterPacket(Packet& packet, Server& server); // Chunk batch functions void sendChunkBatchStart(Packet& packet, Server& server); void sendChunkBatchFinished(Packet& packet, Server& server, int batchSize); -void sendChunkBatchSequence(Packet& packet, Server& server, ThreadSafeQueue* outgoingPackets); +void sendChunkBatchSequence(Packet& packet, Server& server); // Chunk data functions void sendChunkData(Packet& packet, Server& server, int chunkX, int chunkZ); @@ -144,6 +142,23 @@ void sendSetExperience(Packet& packet, Server& server); void sendUpdateTime(Packet& packet, Server& server); void sendSetHeldItem(Packet& packet, Server& server); void handleConfirmTeleportation(Packet& packet, Server& server); -void completeSpawnSequence(Packet& packet, Server& server, ThreadSafeQueue* outgoingPackets); +void completeSpawnSequence(Packet& packet, Server& server); +void sendDisconnectPacket(Packet* packet, const std::string& reason, Server& server); + +Buffer generateEmptyChunkSections(); +void writeLightData(Buffer& buf, const World::ChunkData& chunkData); +void writeActualLightData(Buffer& buf, const World::ChunkData& chunkData); +void writeEmptyLightData(Buffer& buf); + +void clientboundKnownPacks(Packet& packet); +void serverboundKnownPacks(Packet& packet); + +void gameEventPacket(Packet& packet, Server& server); +void levelChunkWithLight(Packet& packet, Server& server); + +// Optional Packets +void changeDifficulty(Packet& packet); +void playerAbilities(Packet& packet); +void setHeldItem(Packet& packet); #endif diff --git a/include/packet.hpp b/include/network/packet.hpp similarity index 50% rename from include/packet.hpp rename to include/network/packet.hpp index 280d68d..48da62a 100644 --- a/include/packet.hpp +++ b/include/network/packet.hpp @@ -1,11 +1,13 @@ #ifndef PACKET_HPP #define PACKET_HPP +#include "../lib/UUID.hpp" +#include "../player.hpp" #include "buffer.hpp" -#include "player.hpp" #include "server.hpp" #include +#include enum PacketResult { PACKET_OK = 0, PACKET_SEND = 1, PACKET_DISCONNECT = 2, PACKET_ERROR = -1 }; @@ -13,10 +15,10 @@ class Packet { private: int32_t _size; int32_t _id; - Buffer _data; + Buffer _data; Player* _player; - int _socketFd; - int _returnPacket; + int _socketFd; + int _returnPacket; public: Packet(Player* player); @@ -24,21 +26,21 @@ class Packet { Packet(const Packet& other); Packet& operator=(const Packet& other); ~Packet(); - static int readVarint(int sock); - static int readVarint(int sock, int* bytesRead); + static int readVarint(int sock); + static int readVarint(int sock, int* bytesRead); static void writeVarint(int sock, int value); - static int varintLen(int value); + static int varintLen(int value); static bool isSocketValid(int sock); - Player* getPlayer() const; - uint32_t getSize(); - uint32_t getId(); - Buffer& getData(); - int getSocket() const; - void setReturnPacket(int value); - int getReturnPacket(); - int getVarintSize(int32_t value); - void setPacketSize(int32_t value); - void setPacketId(uint32_t value); + Player* getPlayer() const; + uint32_t getSize(); + uint32_t getId(); + Buffer& getData(); + int getSocket() const; + void setReturnPacket(int value); + int getReturnPacket(); + int getVarintSize(int32_t value); + void setPacketSize(int32_t value); + void setPacketId(uint32_t value); }; #endif diff --git a/include/network/server.hpp b/include/network/server.hpp new file mode 100644 index 0000000..6891796 --- /dev/null +++ b/include/network/server.hpp @@ -0,0 +1,62 @@ +#ifndef SERVER_HPP +#define SERVER_HPP + +class NetworkManager; +#include "../config.hpp" +#include "../player.hpp" +#include "../world/world.hpp" +#include "id_manager.hpp" +#include "lib/json.hpp" + +#include +#include +#include +#include + +using json = nlohmann::json; + +class Server { + private: + std::unordered_map _playerLst; + std::unordered_map _tempPlayerLst; + json _playerSample; + std::mutex _playerLock; + std::mutex _tempPlayerLock; + Config _config; + NetworkManager* _networkManager; + IdManager _idManager; + World::Manager _worldManager; + World::LevelDat _worldData; + World::Query _worldQuery; + + public: + Server(); + ~Server(); + + int start_server(); + + int getAmountOnline(); + Config& getConfig() { return _config; } + std::unordered_map& getPlayerLst() { return _playerLst; } + std::unordered_map& getTempPlayerLst() { return _tempPlayerLst; } + + void addPlayerToSample(const std::string& name); + void removePlayerToSample(const std::string& name); + Player* addPlayer(const std::string& name, const PlayerState state, const int socket); + void removePlayer(Player* player); + Player* addTempPlayer(const std::string& name, const PlayerState state, const int socket); + void removeTempPlayer(Player* player); + void promoteTempPlayer(Player* player); + void removePlayerFromAnyList(Player* player); + json getPlayerSample(); + IdManager& getIdManager() { return (_idManager); } + + NetworkManager& getNetworkManager() { return *_networkManager; } + World::Manager& getWorldManager() { return _worldManager; } + World::LevelDat& getWorldData() { return _worldData; } + World::Query& getWorldQuery() { return _worldQuery; } + + void printChunkInfo(const World::ChunkData& chunk); +}; + +#endif diff --git a/include/player.hpp b/include/player.hpp index 8e1b7ec..a868e13 100644 --- a/include/player.hpp +++ b/include/player.hpp @@ -1,38 +1,38 @@ #ifndef PLAYER_HPP #define PLAYER_HPP -#include "UUID.hpp" +#include "lib/UUID.hpp" -#include #include +#include class Server; -enum class PlayerState { None, Configuration ,Handshake, Status, Login, Play }; +enum class PlayerState { None, Configuration, Handshake, Status, Login, Play }; class PlayerConfig { private: - int _chatMode; - int _mainHand; + int _chatMode; + int _mainHand; std::string _locale; - uint8_t _viewDistance; - uint8_t _displayedSkinParts; - bool _chatColors; - bool _enableTextFiltering; - bool _allowServerListings; + uint8_t _viewDistance; + uint8_t _displayedSkinParts; + bool _chatColors; + bool _enableTextFiltering; + bool _allowServerListings; public: PlayerConfig(); ~PlayerConfig(); // Getters - int getChatMode() const { return _chatMode; } - int getMainHand() const { return _mainHand; } + int getChatMode() const { return _chatMode; } + int getMainHand() const { return _mainHand; } std::string getLocale() const { return _locale; } - uint8_t getViewDistance() const { return _viewDistance; } - uint8_t getDisplayedSkinParts() const { return _displayedSkinParts; } - bool getChatColors() const { return _chatColors; } - bool getTextFiltering() const { return _enableTextFiltering; } - bool getServerListings() const { return _allowServerListings; } + uint8_t getViewDistance() const { return _viewDistance; } + uint8_t getDisplayedSkinParts() const { return _displayedSkinParts; } + bool getChatColors() const { return _chatColors; } + bool getTextFiltering() const { return _enableTextFiltering; } + bool getServerListings() const { return _allowServerListings; } // Setters void setChatMode(int mode) { _chatMode = mode; } @@ -47,14 +47,14 @@ class PlayerConfig { class Player { private: - std::string _name; - PlayerState _state; - int _socketFd; - int x, y, z; - int health; - UUID _uuid; - int _playerId; - Server& _server; + std::string _name; + PlayerState _state; + int _socketFd; + int x, y, z; + int health; + UUID _uuid; + int _playerId; + Server& _server; PlayerConfig* _config; public: @@ -64,16 +64,16 @@ class Player { ~Player(); std::string getPlayerName(void); - void setPlayerName(const std::string& name); + void setPlayerName(const std::string& name); PlayerState getPlayerState(); - void setPlayerState(PlayerState state); - void setSocketFd(int socket); - int getSocketFd() const; + void setPlayerState(PlayerState state); + void setSocketFd(int socket); + int getSocketFd() const; // Get PlayerConfig instance PlayerConfig* getPlayerConfig() { return _config; } - int getPlayerID() const; - void setUUID(UUID uuid); + int getPlayerID() const; + void setUUID(UUID uuid); }; #endif diff --git a/include/server.hpp b/include/server.hpp deleted file mode 100644 index 41d2efc..0000000 --- a/include/server.hpp +++ /dev/null @@ -1,76 +0,0 @@ -#ifndef SERVER_HPP -#define SERVER_HPP - -class NetworkManager; -#include "id_manager.hpp" -#include "json.hpp" -#include "player.hpp" - -#include -#include -#include -#include -#define ConfigFileName "config.json" - -using json = nlohmann::json; - -class Server { - private: - std::unordered_map _playerLst; - std::unordered_map _tempPlayerLst; - json _playerSample; - std::mutex _playerLock; - std::mutex _tempPlayerLock; - int _protocolVersion; - int _serverSize; - int loadConfig(); - std::string _gameVersion; - std::string _serverMOTD; - int _serverPort; - std::string _serverAddr; - NetworkManager* _networkManager; - IdManager _idManager; - - public: - Server(); - ~Server(); - - int start_server(); - - int getProtocolVersion(); - int getServerSize(); - int getAmountOnline(); - std::string getGameVersion(); - std::string getServerMOTD(); - int getServerPort() { - return _serverPort; - } - std::string getServerAddr() { - return _serverAddr; - } - std::unordered_map& getPlayerLst() { - return _playerLst; - } - std::unordered_map& getTempPlayerLst() { - return _tempPlayerLst; - } - - void addPlayerToSample(const std::string& name); - void removePlayerToSample(const std::string& name); - Player* addPlayer(const std::string& name, const PlayerState state, const int socket); - void removePlayer(Player* player); - Player* addTempPlayer(const std::string& name, const PlayerState state, const int socket); - void removeTempPlayer(Player* player); - void promoteTempPlayer(Player* player); - void removePlayerFromAnyList(Player* player); - json getPlayerSample(); - IdManager& getIdManager() { - return (_idManager); - } - - NetworkManager& getNetworkManager() { - return *_networkManager; - } -}; - -#endif diff --git a/include/world/world.hpp b/include/world/world.hpp new file mode 100644 index 0000000..8b3e829 --- /dev/null +++ b/include/world/world.hpp @@ -0,0 +1,131 @@ +#ifndef WORLD_MANAGER_HPP +#define WORLD_MANAGER_HPP + +#include "lib/nbt.hpp" +#include "logger.hpp" + +#include +#include +#include +#include +#include +#include + +namespace World { + + struct LevelDat { // see https://minecraft.wiki/w/Java_Edition_level_format#level.dat_format + // Existing fields + bool allowCommands; + double BorderCenterX; + double BorderCenterY; + double BorderDamagePerBlock; + double BorderSafeZone; + long BorderSizeLerpTarget; + double BorderWarningBlocks; + double BorderWarningTime; + int clearWeatherTime; + int DataVersion; + long DayTime; + std::byte Difficulty; + bool DifficultyLocked; + int GameType; + std::string generatorName; + int generatorVersiona; + bool hardcore; + bool initialized; + long LastPlayed; + std::string LevelName; + bool MapFeatures; + bool raining; + int rainTime; + long RandomSeed; + long SizeOnDisk; + int SpawnX; + int SpawnY; + int SpawnZ; + bool thundering; + int thunderTime; + long Time; + int version; + int WanderingTraderSpawnChange; + int WanderingTraderSpawnDelay; + bool WasModded; + + // The full NBT data, for accessing less common or custom tags + nbt::NBT nbtData; + }; + + struct ChunkData { + int chunkX; + int chunkZ; + + std::vector blockData; + std::vector biomeData; + std::vector heightmaps; + std::vector blockEntities; + + std::vector skyLight; + std::vector blockLight; + + ChunkData(int x, int z) : chunkX(x), chunkZ(z) {} + + bool isEmpty() const { return blockData.empty(); } + }; + + class Manager { + public: + static std::vector decompressGzip(std::filesystem::path compressedFilePath); + static std::vector decompressGzip(const std::vector& compressedData); + static std::vector decompressZlib(const std::vector& compressedData); + + std::filesystem::path locateRegionFileByChunkCoord(int ChunkX, int ChunkZ); + LevelDat loadLevelDat(std::filesystem::path levelDatPath); + + const LevelDat& getLevelDat() const { return _LevelDat; } + + void setWorldPath(const std::filesystem::path& worldPath) { _worldPath = worldPath; } + const std::filesystem::path& getWorldPath() const { return _worldPath; } + + private: + LevelDat _LevelDat; + std::filesystem::path _worldPath; + }; + + class Query { + public: + explicit Query(Manager& manager) : _worldManager(manager) {} + ChunkData fetchChunk(int chunkX, int chunkZ) { + ChunkData chunk(chunkX, chunkZ); + + try { + auto regionPath = _worldManager.locateRegionFileByChunkCoord(chunkX, chunkZ); + chunk = loadChunkFromRegion(regionPath, chunkX, chunkZ); + } catch (const std::exception& e) { + g_logger->logGameInfo(DEBUG, + "Chunk (" + std::to_string(chunkX) + ", " + std::to_string(chunkZ) + + ") not found, sending empty chunk: " + e.what(), + "World::Query::fetchChunk"); + chunk = generateEmptyChunk(chunkX, chunkZ); + } + + return chunk; + } + const LevelDat& getWorldData() const { return _worldManager.getLevelDat(); } + + private: + Manager& _worldManager; + + private: + void extractChunkDataFromNBT(const nbt::NBT& chunkNBT, ChunkData& chunk); + void extractSectionsData(const nbt::TagList& sections, ChunkData& chunk); + void extractBlockStatesFromSection(const nbt::TagCompound& blockStates, ChunkData& chunk, int8_t sectionY); + void extractHeightmaps(const nbt::TagCompound& heightmaps, ChunkData& chunk); + void extractBlockEntities(const nbt::TagList& blockEntities, ChunkData& chunk); + void extractBiomesFromSections(const nbt::TagCompound& root, ChunkData& chunk); + ChunkData generateEmptyChunk(int chunkX, int chunkZ); + ChunkData loadChunkFromRegion(const std::filesystem::path& regionPath, int chunkX, int chunkZ); + }; + +} // namespace World + +#endif diff --git a/src/data/RegistryData.cpp b/src/data/RegistryData.cpp new file mode 100644 index 0000000..b2abcac --- /dev/null +++ b/src/data/RegistryData.cpp @@ -0,0 +1,76 @@ +#include "data/RegistryData.hpp" + +#include "network/buffer.hpp" + +#include +#include +#include +#include + +RegistryData::RegistryData() : _registry_id(""), _entries() {} + +RegistryData::RegistryData(const std::string& registryId) : _registry_id(registryId), _entries() {} + +RegistryData::~RegistryData() = default; + +RegistryData::RegistryData(const RegistryData& other) : _registry_id(other._registry_id), _entries(other._entries) {} + +RegistryData& RegistryData::operator=(const RegistryData& other) { + if (this != &other) { + _registry_id = other._registry_id; + _entries = other._entries; + } + return *this; +} + +RegistryData::RegistryData(RegistryData&& other) noexcept : _registry_id(std::move(other._registry_id)), _entries(std::move(other._entries)) {} + +RegistryData& RegistryData::operator=(RegistryData&& other) noexcept { + if (this != &other) { + _registry_id = std::move(other._registry_id); + _entries = std::move(other._entries); + } + return *this; +} + +const std::string& RegistryData::getRegistryId() const { return _registry_id; } + +const std::vector& RegistryData::getEntries() const { return _entries; } + +size_t RegistryData::getEntryCount() const { return _entries.size(); } + +void RegistryData::addEntry(const std::string& entryId, bool hasData, std::optional> data) { + _entries.emplace_back(entryId, hasData, data); +} + +std::vector RegistryData::serialize() const { + try { + Buffer buffer; + + // Format MC 1.21.5: id + entries length + entries array + buffer.writeIdentifier(_registry_id); + buffer.writeVarInt(static_cast(_entries.size())); + + for (const auto& entry : _entries) { + // Chaque entrΓ©e: key (string) + value optional (anonymousNbt) + buffer.writeIdentifier(entry.entry_id); + + // Format "value optional": boolean prΓ©sent + donnΓ©es NBT si prΓ©sent + if (entry.has_data && entry.data.has_value()) { + buffer.writeBool(true); // DonnΓ©es prΓ©sentes + buffer.writeNBT("{}"); // DonnΓ©es NBT (vide pour l'instant) + } else { + buffer.writeBool(false); // Pas de donnΓ©es NBT optionnelles + } + } + + return buffer.getData(); + + } catch (const std::exception& e) { + throw std::runtime_error("Failed to serialize RegistryData: " + std::string(e.what())); + } +} + +bool RegistryData::isEmpty() const { return _entries.empty(); } + +void RegistryData::reserve(size_t capacity) { _entries.reserve(capacity); } diff --git a/src/data/RegistryDataUtils.cpp b/src/data/RegistryDataUtils.cpp new file mode 100644 index 0000000..ad7ea2e --- /dev/null +++ b/src/data/RegistryDataUtils.cpp @@ -0,0 +1,318 @@ +#include "RegistryDataUtils.hpp" + +#include "RegistryData.hpp" +#include "RegistryIds.hpp" +#include "logger.hpp" +#include "minecraftRegistries.hpp" +#include "network/buffer.hpp" +#include "network/networking.hpp" + +#include +#include +#include +#include + +std::vector parseMinecraftRegistries() { + std::vector registries; + + try { + registries.reserve(REGISTRIES.size()); + + for (const auto& registryPair : REGISTRIES) { + const std::string& registryName = registryPair.first; + const Registry& registry = registryPair.second; + + // Ne pas ignorer les registres vides - les crΓ©er quand mΓͺme + if (registry.entries.empty()) { + if (g_logger) { + g_logger->logNetwork(WARN, "Creating empty registry: " + registryName, "RegistryData"); + } + // CrΓ©er un registre vide au lieu de l'ignorer + RegistryData emptyRegistry(registryName); + registries.push_back(std::move(emptyRegistry)); + continue; + } + + RegistryData registryData(registryName); + + registryData.reserve(registry.entries.size()); + + for (const auto& entry : registry.entries) { + // En MC 1.21.5, certains registres nΓ©cessitent des donnΓ©es NBT + bool needsNBT = + (registryName == "minecraft:damage_type" || registryName == "minecraft:dimension_type" || + registryName == "minecraft:enchantment" || registryName == "minecraft:worldgen/biome" || + registryName == "minecraft:banner_pattern" || registryName == "minecraft:trim_material" || + registryName == "minecraft:trim_pattern" || registryName == "minecraft:painting_variant" || + registryName == "minecraft:jukebox_song" || registryName == "minecraft:instrument" || registryName == "minecraft:chat_type"); + + registryData.addEntry(entry.name, needsNBT); + } + + if (validateRegistryData(registryData)) { + registries.push_back(std::move(registryData)); + + if (g_logger) { + g_logger->logNetwork(INFO, + "Parsed registry: " + registryName + " with " + std::to_string(registry.entries.size()) + " entries", + "RegistryData"); + } + } else { + if (g_logger) { + g_logger->logNetwork(ERROR, "Failed to validate parsed registry: " + registryName, "RegistryData"); + } + } + } + + if (g_logger) { + g_logger->logNetwork( + INFO, "Successfully parsed " + std::to_string(registries.size()) + " registries from minecraft_registries.h", "RegistryData"); + } + + } catch (const std::exception& e) { + if (g_logger) { + g_logger->logNetwork(ERROR, "Failed to parse minecraft registries: " + std::string(e.what()), "RegistryData"); + } + registries.clear(); + } + + return registries; +} + +void sendRegistryData(Packet& packet, Server& server) { + g_logger->logNetwork(INFO, "=== Sending Registry Data packets (0x07) using parseMinecraftRegistries ===", "Configuration"); + + try { + std::vector registries = parseMinecraftRegistries(); + + if (registries.empty()) { + g_logger->logNetwork(ERROR, "No registries parsed from minecraft_registries.h", "Configuration"); + packet.setReturnPacket(PACKET_ERROR); + return; + } + + g_logger->logNetwork( + INFO, "Successfully parsed " + std::to_string(registries.size()) + " registries from minecraft_registries.h", "Configuration"); + + sendRegistryDataBatch(packet, server, registries); + + } catch (const std::exception& e) { + g_logger->logNetwork(ERROR, "Failed to send registry data: " + std::string(e.what()), "Configuration"); + packet.setReturnPacket(PACKET_ERROR); + } +} + +bool validateRegistryData(const RegistryData& registry) { + if (registry.getRegistryId().empty()) { + if (g_logger) { + g_logger->logNetwork(ERROR, "Registry validation failed: empty registry ID", "RegistryData"); + } + return false; + } + + if (registry.isEmpty()) { + if (g_logger) { + g_logger->logNetwork(WARN, "Registry validation: registry is empty - " + registry.getRegistryId(), "RegistryData"); + } + // Ne pas rejeter les registres vides - MC 1.21.5 peut en avoir + // return false; + } + + std::set entryIds; + for (const auto& entry : registry.getEntries()) { + if (entry.entry_id.empty()) { + if (g_logger) { + g_logger->logNetwork( + ERROR, "Registry validation failed: entry with empty ID in registry: " + registry.getRegistryId(), "RegistryData"); + } + return false; + } + + if (entryIds.find(entry.entry_id) != entryIds.end()) { + if (g_logger) { + g_logger->logNetwork(ERROR, + "Registry validation failed: duplicate entry ID '" + entry.entry_id + + "' in registry: " + registry.getRegistryId(), + "RegistryData"); + } + return false; + } + + entryIds.insert(entry.entry_id); + } + + return true; +} + +RegistryData createRegistryFromMap(const std::string& registryName, const std::map& registryData, bool addNamespace) { + std::string fullRegistryName = addNamespace ? "minecraft:" + registryName : registryName; + RegistryData registry(fullRegistryName); + + registry.reserve(registryData.size()); + + for (const auto& entry : registryData) { + registry.addEntry(entry.first, false); + } + + return registry; +} + +std::vector serializeRegistryPacket(const RegistryData& registry) { + try { + std::vector registryBytes = registry.serialize(); + + Buffer packetBuffer; + + int packetId = RegistryData::PACKET_ID; + int packetIdSize = 1; + int totalPacketSize = packetIdSize + static_cast(registryBytes.size()); + + packetBuffer.writeVarInt(totalPacketSize); + + packetBuffer.writeVarInt(packetId); + + packetBuffer.writeBytes(registryBytes); + + return packetBuffer.getData(); + + } catch (const std::exception& e) { + throw std::runtime_error("Failed to serialize registry packet: " + std::string(e.what())); + } +} + +void sendRegistryDataBatch(Packet& packet, Server& server, const std::vector& registries) { + if (registries.empty()) { + if (g_logger) { + g_logger->logNetwork(WARN, "No registries provided to sendRegistryDataBatch", "Configuration"); + } + packet.setReturnPacket(PACKET_OK); + return; + } + + Player* player = packet.getPlayer(); + if (!player) { + if (g_logger) { + g_logger->logNetwork(ERROR, "No player found in packet for registry data batch", "Configuration"); + } + packet.setReturnPacket(PACKET_ERROR); + return; + } + + ThreadSafeQueue* outgoingPackets = server.getNetworkManager().getOutgoingQueue(); + if (!outgoingPackets) { + if (g_logger) { + g_logger->logNetwork(ERROR, "No outgoing packet queue available", "Configuration"); + } + packet.setReturnPacket(PACKET_ERROR); + return; + } + + if (g_logger) { + g_logger->logNetwork(INFO, "Sending registry data batch with " + std::to_string(registries.size()) + " registries", "Configuration"); + } + + int successCount = 0; + int errorCount = 0; + + for (const auto& registry : registries) { + if (!validateRegistryData(registry)) { + if (g_logger) { + g_logger->logNetwork(ERROR, "Invalid registry data for: " + registry.getRegistryId(), "Configuration"); + } + errorCount++; + continue; + } + + try { + std::vector packetData = serializeRegistryPacket(registry); + + Packet* registryPacket = new Packet(packet); + + Buffer buffer; + buffer.writeBytes(packetData); + + registryPacket->getData() = buffer; + registryPacket->setPacketSize(packetData.size()); + registryPacket->setReturnPacket(PACKET_SEND); + + outgoingPackets->push(registryPacket); + successCount++; + + if (g_logger) { + g_logger->logNetwork(INFO, + "Queued registry: " + registry.getRegistryId() + " (" + std::to_string(registry.getEntryCount()) + " entries)", + "Configuration"); + } + + } catch (const std::exception& e) { + errorCount++; + if (g_logger) { + g_logger->logNetwork( + ERROR, "Exception while queuing registry " + registry.getRegistryId() + ": " + std::string(e.what()), "Configuration"); + } + } + } + + if (g_logger) { + g_logger->logNetwork(INFO, + "Registry data batch complete: " + std::to_string(successCount) + " sent, " + std::to_string(errorCount) + " errors", + "Configuration"); + } + + packet.setReturnPacket((errorCount == 0) ? PACKET_OK : PACKET_ERROR); +} + +std::vector createAllEssentialRegistries() { + std::vector registries; + + try { + registries = parseMinecraftRegistries(); + + if (!registries.empty()) { + if (g_logger) { + g_logger->logNetwork(INFO, "Using parsed registries from minecraft_registries.h", "RegistryData"); + } + return registries; + } + + if (g_logger) { + g_logger->logNetwork(WARN, "parseMinecraftRegistries returned empty, using fallback method", "RegistryData"); + } + + std::vector>> registrySources = { + {"block", RegistryIds::getBlock()}, + {"item", RegistryIds::getItem()}, + {"entity_type", RegistryIds::getEntityType()}, + {"sound_event", RegistryIds::getSoundEvent()}, + {"particle_type", RegistryIds::getParticleType()}, + {"mob_effect", RegistryIds::getMobEffect()}, + {"block_entity_type", RegistryIds::getBlockEntityType()}, + {"menu", RegistryIds::getMenu()}, + {"recipe_type", RegistryIds::getRecipeType()}, + {"recipe_serializer", RegistryIds::getRecipeSerializer()}}; + + for (const auto& source : registrySources) { + if (!source.second.empty()) { + RegistryData registry = createRegistryFromMap(source.first, source.second, true); + registries.push_back(std::move(registry)); + } else { + if (g_logger) { + g_logger->logNetwork(WARN, "Registry data source is empty for: " + source.first, "RegistryData"); + } + } + } + + if (g_logger) { + g_logger->logNetwork( + INFO, "Created " + std::to_string(registries.size()) + " essential registries using fallback method", "RegistryData"); + } + + } catch (const std::exception& e) { + if (g_logger) { + g_logger->logNetwork(ERROR, "Failed to create essential registries: " + std::string(e.what()), "RegistryData"); + } + registries.clear(); + } + + return registries; +} diff --git a/src/data/TagUtils.cpp b/src/data/TagUtils.cpp new file mode 100644 index 0000000..b61c3ff --- /dev/null +++ b/src/data/TagUtils.cpp @@ -0,0 +1,86 @@ +#include "data/TagUtils.hpp" + +#include "logger.hpp" + +#include + +std::optional> TagUtils::getTagsForRegistry(const std::string& registryName) { + auto it = RegistriesTags.find(registryName); + if (it != RegistriesTags.end()) { + return it->second; + } + return std::nullopt; +} + +std::optional TagUtils::getTag(const std::string& registryName, const std::string& tagName) { + auto registryIt = RegistriesTags.find(registryName); + if (registryIt != RegistriesTags.end()) { + auto tagIt = std::find_if(registryIt->second.begin(), registryIt->second.end(), [&tagName](const Tag& tag) { return tag.name == tagName; }); + if (tagIt != registryIt->second.end()) { + return *tagIt; + } + } + return std::nullopt; +} + +bool TagUtils::hasTag(const std::string& registryName, const std::string& tagName) { return getTag(registryName, tagName).has_value(); } + +bool TagUtils::isInTag(const std::string& registryName, const std::string& tagName, int entryId) { + auto tag = getTag(registryName, tagName); + if (tag.has_value()) { + const auto& entries = tag->entries; + return std::find(entries.begin(), entries.end(), entryId) != entries.end(); + } + return false; +} + +std::vector TagUtils::getAllRegistryNames() { + std::vector names; + names.reserve(RegistriesTags.size()); + for (const auto& [name, tags] : RegistriesTags) { + names.push_back(name); + } + return names; +} + +size_t TagUtils::getTotalTagCount() { + size_t total = 0; + for (const auto& [registryName, tags] : RegistriesTags) { + total += tags.size(); + } + return total; +} + +size_t TagUtils::getTagCountForRegistry(const std::string& registryName) { + auto it = RegistriesTags.find(registryName); + if (it != RegistriesTags.end()) { + return it->second.size(); + } + return 0; +} + +std::vector TagUtils::getEntriesForTag(const std::string& registryName, const std::string& tagName) { + auto tag = getTag(registryName, tagName); + if (tag.has_value()) { + return tag->entries; + } + return {}; +} + +void TagUtils::logTagStatistics() { + if (!g_logger) return; + + size_t totalTags = getTotalTagCount(); + g_logger->logGameInfo(INFO, "=== Tag Statistics ===", "TagUtils"); + g_logger->logGameInfo(INFO, "Total registries: " + std::to_string(RegistriesTags.size()), "TagUtils"); + g_logger->logGameInfo(INFO, "Total tags: " + std::to_string(totalTags), "TagUtils"); + + for (const auto& [registryName, tags] : RegistriesTags) { + size_t totalEntries = 0; + for (const auto& tag : tags) { + totalEntries += tag.entries.size(); + } + g_logger->logGameInfo( + INFO, registryName + ": " + std::to_string(tags.size()) + " tags, " + std::to_string(totalEntries) + " total entries", "TagUtils"); + } +} diff --git a/src/data/updateTags.cpp b/src/data/updateTags.cpp new file mode 100644 index 0000000..f423aef --- /dev/null +++ b/src/data/updateTags.cpp @@ -0,0 +1,85 @@ +#include "data/RegistriesTag.hpp" +#include "data/TagUtils.hpp" +#include "logger.hpp" +#include "network/networking.hpp" +#include "network/packet.hpp" +#include "network/server.hpp" +#include "player.hpp" + +void sendUpdateTags(Packet& packet, Server& server) { + g_logger->logNetwork(INFO, "=== Sending Update Tags packet (0x0D) ===", "Configuration"); + + Player* player = packet.getPlayer(); + if (!player) { + g_logger->logNetwork(ERROR, "No player associated with Update Tags packet", "Configuration"); + packet.setReturnPacket(PACKET_DISCONNECT); + return; + } + + ThreadSafeQueue* outgoingPackets = server.getNetworkManager().getOutgoingQueue(); + if (!outgoingPackets) { + g_logger->logNetwork(ERROR, "No outgoing packet queue available", "Configuration"); + packet.setReturnPacket(PACKET_ERROR); + return; + } + + try { + TagUtils::logTagStatistics(); + + Buffer tagBuffer; + size_t totalRegistries = RegistriesTags.size(); + size_t totalTags = TagUtils::getTotalTagCount(); + size_t totalEntries = 0; + + tagBuffer.writeVarInt(static_cast(totalRegistries)); + + for (const auto& [registryName, tags] : RegistriesTags) { + tagBuffer.writeString(registryName); + tagBuffer.writeVarInt(static_cast(tags.size())); + + size_t registryEntries = 0; + for (const auto& tag : tags) { + tagBuffer.writeString(tag.name); + tagBuffer.writeVarInt(static_cast(tag.entries.size())); + + for (int entryId : tag.entries) { + tagBuffer.writeVarInt(entryId); + } + registryEntries += tag.entries.size(); + } + + totalEntries += registryEntries; + g_logger->logNetwork(DEBUG, + "Registry: " + registryName + " -> " + std::to_string(tags.size()) + " tags, " + std::to_string(registryEntries) + + " entries", + "Configuration"); + } + + Buffer finalBuf; + int packetId = 0x0D; + int packetIdSize = packet.getVarintSize(packetId); + int totalPayloadSize = packetIdSize + tagBuffer.getData().size(); + + finalBuf.writeVarInt(totalPayloadSize); + finalBuf.writeVarInt(packetId); + finalBuf.writeBytes(tagBuffer.getData()); + + Packet* tagsPacket = new Packet(packet); + tagsPacket->getData() = finalBuf; + tagsPacket->setPacketSize(finalBuf.getData().size()); + tagsPacket->setReturnPacket(PACKET_SEND); + + outgoingPackets->push(tagsPacket); + + g_logger->logNetwork(INFO, + "Update Tags packet sent: " + std::to_string(totalRegistries) + " registries, " + std::to_string(totalTags) + " tags, " + + std::to_string(totalEntries) + " entries, packet size: " + std::to_string(finalBuf.getData().size()) + " bytes", + "Configuration"); + + packet.setReturnPacket(PACKET_OK); + + } catch (const std::exception& e) { + g_logger->logNetwork(ERROR, "Failed to send Update Tags packet: " + std::string(e.what()), "Configuration"); + packet.setReturnPacket(PACKET_ERROR); + } +} diff --git a/src/entities/player.cpp b/src/entities/player.cpp new file mode 100644 index 0000000..2f6944a --- /dev/null +++ b/src/entities/player.cpp @@ -0,0 +1,54 @@ +#include "player.hpp" + +#include "lib/UUID.hpp" +#include "network/server.hpp" + +#include + +Player::Player(Server& server) + : _name("Player_entity"), _state(PlayerState::None), _socketFd(-1), x(0), y(0), z(0), health(0), _uuid(), + _playerId(server.getIdManager().allocate()), _server(server), _config(new PlayerConfig()) {} + +Player::Player(const std::string& name, const PlayerState state, const int socket, Server& server) + : _state(state), _socketFd(socket), x(0), y(0), z(0), health(20), _uuid(), _playerId(server.getIdManager().allocate()), _server(server), + _config(new PlayerConfig()) { + if (name.length() > 32) + _name = name.substr(0, 31); + else + _name = name; +} + +Player& Player::operator=(const Player& src) { + if (this != &src) { + this->_name = src._name; + this->_socketFd = src._socketFd; + this->health = src.health; + this->x = src.x; + this->y = src.y; + this->z = src.z; + } + return (*this); +} + +Player::~Player() { + _server.getIdManager().release(_playerId); + delete _config; +} + +std::string Player::getPlayerName(void) { return (this->_name); }; +void Player::setPlayerName(const std::string& name) { this->_name = name; } +PlayerState Player::getPlayerState() { return (this->_state); } +void Player::setPlayerState(PlayerState state) { this->_state = state; } +void Player::setSocketFd(int socket) { this->_socketFd = socket; } +int Player::getSocketFd() const { return (this->_socketFd); } + +void Player::setUUID(UUID uuid) { _uuid = uuid; } + +int Player::getPlayerID() const { return (_playerId); } + +// PlayerConfig implementation +PlayerConfig::PlayerConfig() + : _chatMode(0), _mainHand(1), _locale("en_US"), _viewDistance(10), _displayedSkinParts(0), _chatColors(true), _enableTextFiltering(false), + _allowServerListings(true) {} + +PlayerConfig::~PlayerConfig() {} diff --git a/src/MD5.cpp b/src/lib/MD5.cpp similarity index 73% rename from src/MD5.cpp rename to src/lib/MD5.cpp index 4d3f919..27c65b5 100644 --- a/src/MD5.cpp +++ b/src/lib/MD5.cpp @@ -1,4 +1,4 @@ -#include "MD5.hpp" +#include "lib/MD5.hpp" #include @@ -12,22 +12,12 @@ namespace { constexpr uint32_t initC = 0x98badcfe; constexpr uint32_t initD = 0x10325476; - inline uint32_t F(uint32_t x, uint32_t y, uint32_t z) { - return (x & y) | (~x & z); - } - inline uint32_t G(uint32_t x, uint32_t y, uint32_t z) { - return (x & z) | (y & ~z); - } - inline uint32_t H(uint32_t x, uint32_t y, uint32_t z) { - return x ^ y ^ z; - } - inline uint32_t I(uint32_t x, uint32_t y, uint32_t z) { - return y ^ (x | ~z); - } + inline uint32_t F(uint32_t x, uint32_t y, uint32_t z) { return (x & y) | (~x & z); } + inline uint32_t G(uint32_t x, uint32_t y, uint32_t z) { return (x & z) | (y & ~z); } + inline uint32_t H(uint32_t x, uint32_t y, uint32_t z) { return x ^ y ^ z; } + inline uint32_t I(uint32_t x, uint32_t y, uint32_t z) { return y ^ (x | ~z); } - inline uint32_t rotate_left(uint32_t x, int n) { - return (x << n) | (x >> (32 - n)); - } + inline uint32_t rotate_left(uint32_t x, int n) { return (x << n) | (x >> (32 - n)); } } // namespace // petite implΓ©mentation brute de MD5 @@ -55,8 +45,7 @@ std::vector MD5::hash(const std::string& input) { for (size_t offset = 0; offset < data.size(); offset += 64) { uint32_t M[16]; for (int i = 0; i < 16; ++i) { - M[i] = (data[offset + i * 4]) | (data[offset + i * 4 + 1] << 8) | - (data[offset + i * 4 + 2] << 16) | (data[offset + i * 4 + 3] << 24); + M[i] = (data[offset + i * 4]) | (data[offset + i * 4 + 1] << 8) | (data[offset + i * 4 + 2] << 16) | (data[offset + i * 4 + 3] << 24); } uint32_t a = A, b = B, c = C, d = D; @@ -74,9 +63,9 @@ std::vector MD5::hash(const std::string& input) { // rΓ©sultat en octets (little-endian) std::vector digest(16); - uint32_t state[4] = {A, B, C, D}; + uint32_t state[4] = {A, B, C, D}; for (int i = 0; i < 4; i++) { - digest[i * 4] = state[i] & 0xFF; + digest[i * 4] = state[i] & 0xFF; digest[i * 4 + 1] = (state[i] >> 8) & 0xFF; digest[i * 4 + 2] = (state[i] >> 16) & 0xFF; digest[i * 4 + 3] = (state[i] >> 24) & 0xFF; diff --git a/src/UUID.cpp b/src/lib/UUID.cpp similarity index 69% rename from src/UUID.cpp rename to src/lib/UUID.cpp index 40c81a5..5f67cca 100644 --- a/src/UUID.cpp +++ b/src/lib/UUID.cpp @@ -1,6 +1,7 @@ -#include "MD5.hpp" -#include "UUID.hpp" -#include "buffer.hpp" +#include "lib/UUID.hpp" + +#include "lib/MD5.hpp" +#include "network/buffer.hpp" #include #include @@ -13,25 +14,16 @@ UUID::UUID() : _mostSigBits(0), _leastSigBits(0) {} UUID::UUID(uint64_t most, uint64_t least) : _mostSigBits(most), _leastSigBits(least) {} UUID::~UUID() {} -uint64_t UUID::getMostSigBits() const { - return _mostSigBits; -} -uint64_t UUID::getLeastSigBits() const { - return _leastSigBits; -} -void UUID::setMostSigBits(uint64_t val) { - _mostSigBits = val; -} -void UUID::setLeastSigBits(uint64_t val) { - _leastSigBits = val; -} +uint64_t UUID::getMostSigBits() const { return _mostSigBits; } +uint64_t UUID::getLeastSigBits() const { return _leastSigBits; } +void UUID::setMostSigBits(uint64_t val) { _mostSigBits = val; } +void UUID::setLeastSigBits(uint64_t val) { _leastSigBits = val; } std::string UUID::toString() const { std::stringstream ss; - ss << std::hex << std::setfill('0') << std::setw(8) << ((_mostSigBits >> 32) & 0xFFFFFFFF) - << "-" << std::setw(4) << ((_mostSigBits >> 16) & 0xFFFF) << "-" << std::setw(4) - << (_mostSigBits & 0xFFFF) << "-" << std::setw(4) << ((_leastSigBits >> 48) & 0xFFFF) << "-" - << std::setw(12) << (_leastSigBits & 0xFFFFFFFFFFFFULL); + ss << std::hex << std::setfill('0') << std::setw(8) << ((_mostSigBits >> 32) & 0xFFFFFFFF) << "-" << std::setw(4) + << ((_mostSigBits >> 16) & 0xFFFF) << "-" << std::setw(4) << (_mostSigBits & 0xFFFF) << "-" << std::setw(4) << ((_leastSigBits >> 48) & 0xFFFF) + << "-" << std::setw(12) << (_leastSigBits & 0xFFFFFFFFFFFFULL); return ss.str(); } diff --git a/src/buffer.cpp b/src/lib/buffer.cpp similarity index 54% rename from src/buffer.cpp rename to src/lib/buffer.cpp index 24a0f32..39e0033 100644 --- a/src/buffer.cpp +++ b/src/lib/buffer.cpp @@ -1,5 +1,6 @@ -#include "UUID.hpp" -#include "buffer.hpp" +#include "network/buffer.hpp" + +#include "lib/UUID.hpp" #include #include @@ -16,18 +17,9 @@ uint8_t Buffer::readByte() { void Buffer::writeByte(uint8_t byte) { _data.push_back(byte); } -void Buffer::writeBytes(const std::string& data) { - _data.insert(_data.end(), data.begin(), data.end()); -} - -void Buffer::writeBytes(const std::vector& data) { - _data.insert(_data.end(), data.begin(), data.end()); -} +void Buffer::writeBytes(const std::string& data) { _data.insert(_data.end(), data.begin(), data.end()); } -void Buffer::writeShort(int16_t value) { - writeByte(static_cast((value >> 8) & 0xFF)); - writeByte(static_cast(value & 0xFF)); -} +void Buffer::writeBytes(const std::vector& data) { _data.insert(_data.end(), data.begin(), data.end()); } void Buffer::writeUUID(const UUID& uuid) { uint64_t msb = uuid.getMostSigBits(); @@ -39,7 +31,7 @@ void Buffer::writeUUID(const UUID& uuid) { } int Buffer::readVarInt() { - int value = 0, position = 0; + int value = 0, position = 0; uint8_t currentByte; do { @@ -139,17 +131,32 @@ void Buffer::writeLong(long value) { void Buffer::writeBool(bool value) { writeByte(value ? 0x01 : 0x00); } -void Buffer::writeNBT(const std::string& nbtData) { writeBytes(nbtData); } +void Buffer::writeNBT(const std::string& nbtData) { + // Format anonymousNbt pour MC 1.21.5 - compound NBT minimal mais valide + if (nbtData == "{}") { + // Compound NBT vide mais valide: + // TAG_String + nom vide + valeur vide + TAG_End + writeByte(0x08); // TAG_String + writeVarInt(0); // Nom de longueur 0 (anonyme) + writeVarInt(0); // Valeur string vide + writeByte(0x00); // TAG_End pour fermer le compound + } else { + // Pour autres donnΓ©es NBT, utiliser la mΓͺme structure minimale + writeByte(0x08); // TAG_String + writeVarInt(0); // Nom de longueur 0 + writeVarInt(0); // Valeur string vide + writeByte(0x00); // TAG_End + } +} void Buffer::writePosition(int32_t x, int32_t y, int32_t z) { - int64_t packed = ((int64_t)(x & 0x3FFFFFF) << 38) | ((int64_t)(y & 0xFFF) << 26) | - (int64_t)(z & 0x3FFFFFF); + int64_t packed = ((int64_t)(x & 0x3FFFFFF) << 38) | ((int64_t)(y & 0xFFF) << 26) | (int64_t)(z & 0x3FFFFFF); writeLong(packed); } void Buffer::writeFloat(float value) { union { - float f; + float f; uint32_t i; } u; u.f = value; @@ -158,7 +165,7 @@ void Buffer::writeFloat(float value) { void Buffer::writeDouble(double value) { union { - double d; + double d; uint64_t i; } u; u.d = value; @@ -178,3 +185,110 @@ void Buffer::writeVarLong(int64_t value) { } void Buffer::writeIdentifier(const std::string& id) { writeString(id); } + +void Buffer::writeUShort(uint16_t value) { + writeByte(static_cast((value >> 8) & 0xFF)); + writeByte(static_cast(value & 0xFF)); +} + +// NEW: String reading methods +std::string Buffer::readString() { + int len = readVarInt(); + + if (_pos + len > _data.size()) { + throw std::runtime_error("Buffer underflow on string"); + } + + std::string result(reinterpret_cast(&_data[_pos]), len); + _pos += len; + return result; +} + +std::vector Buffer::readStringArray() { + int count = readVarInt(); + if (count < 0) { + throw std::runtime_error("Negative array length"); + } + std::vector result; + result.reserve(count); + + for (int i = 0; i < count; ++i) { + result.push_back(readString()); + } + + return result; +} + +std::vector Buffer::readVarIntArray() { + int count = readVarInt(); + if (count < 0) { + throw std::runtime_error("Negative array length"); + } + std::vector result; + result.reserve(count); + + for (int i = 0; i < count; ++i) { + result.push_back(readVarInt()); + } + + return result; +} + +// NEW: Boolean reading +bool Buffer::readBool() { + uint8_t value = readByte(); + return value != 0; +} + +int32_t Buffer::readInt() { + int32_t value = 0; + for (int i = 0; i < 4; ++i) { + value = (value << 8) | readByte(); + } + return value; +} + +int64_t Buffer::readVarLong() { + int64_t value = 0; + int position = 0; + uint8_t currentByte; + + do { + currentByte = readByte(); + value |= ((int64_t)(currentByte & 0x7F)) << position; + position += 7; + if (position >= 64) throw std::runtime_error("VarLong too big"); + } while (currentByte & 0x80); + + return value; +} + +// NEW: Known Packs support +std::vector Buffer::readKnownPacks() { + int count = readVarInt(); + if (count < 0) { + throw std::runtime_error("Negative array length"); + } + std::vector result; + result.reserve(count); + + for (int i = 0; i < count; ++i) { + KnownPack pack; + pack.nameSpace = readString(); + pack.id = readString(); + pack.version = readString(); + result.push_back(pack); + } + + return result; +} + +void Buffer::writeKnownPacks(const std::vector& packs) { + writeVarInt(static_cast(packs.size())); + + for (const auto& pack : packs) { + writeString(pack.nameSpace); + writeString(pack.id); + writeString(pack.version); + } +} diff --git a/src/lib/config.cpp b/src/lib/config.cpp new file mode 100644 index 0000000..586a0f4 --- /dev/null +++ b/src/lib/config.cpp @@ -0,0 +1,111 @@ +#include "config.hpp" + +#include "lib/filesystem.hpp" +#include "lib/json.hpp" +#include "logger.hpp" + +#include +#include + +using json = nlohmann::json; + +Config::Config() + : _execPath(getPath()), _gameVersion("1.21.5"), _protocolVersion(770), _serverMotd("A Minecraft Server"), _serverAddress("127.0.0.1"), + _serverPort(25565), _serverSize(20), _worldName("world"), _gamemode("survival"), _difficulty("normal") {} + +bool Config::loadConfig() { + std::ifstream inputFile(_execPath.parent_path() / "config.json"); // Should change the config path later if needed + + if (!inputFile.is_open()) { + g_logger->logGameInfo(DEBUG, "Error: Could not open: config.json", "SERVER"); + return true; + } + + json config; + + try { + inputFile >> config; + Config::setServerVersion(config["version"]["name"]); + Config::setProtocolVersion(config["version"]["protocol"]); + Config::setServerSize(config["server"]["max-players"]); + Config::setServerMotd(config["server"]["motd"]); + Config::setServerAddress(config["server"]["ip-address"]); + Config::setServerPort(config["server"]["port"]); + Config::setWorldName(config["world"]["name"]); + Config::setGamemode(config["world"]["gamemode"]); + Config::setDifficulty(config["world"]["difficulty"]); + } catch (json::parse_error& e) { + g_logger->logGameInfo(ERROR, "Error parsing config.json: " + std::string(e.what()), "SERVER"); + inputFile.close(); + return true; + } + inputFile.close(); + return false; +} + +bool Config::reloadConfig() { + std::ifstream inputFile(_execPath.root_directory() / "config.json"); // Should change the config path later if needed + + if (!inputFile.is_open()) { + g_logger->logGameInfo(DEBUG, "Error: Could not open: config.json", "SERVER"); + return true; + } + + json config; + + try { + inputFile >> config; + // Reload server settings that can be changed at runtime + Config::setServerSize(config["server"]["max-players"]); + Config::setServerMotd(config["server"]["motd"]); + + // Reload world settings that can be changed at runtime + Config::setGamemode(config["world"]["gamemode"]); + Config::setDifficulty(config["world"]["difficulty"]); + } catch (json::parse_error& e) { + g_logger->logGameInfo(ERROR, "Error parsing config.json: " + std::string(e.what()), "SERVER"); + inputFile.close(); + return true; + } + return false; +} + +Config::~Config() {} + +// Getter methods +int Config::getServerPort() { return _serverPort; } + +int Config::getProtocolVersion() { return _protocolVersion; } + +int Config::getServerSize() { return _serverSize; } + +std::string Config::getVersion() { return _gameVersion; } + +std::string Config::getServerMotd() { return _serverMotd; } + +std::string Config::getServerAddress() { return _serverAddress; } + +std::string Config::getWorldName() { return _worldName; } + +std::string Config::getGamemode() { return _gamemode; } + +std::string Config::getDifficulty() { return _difficulty; } + +// Setter methods +void Config::setProtocolVersion(int ProtoVersion) { _protocolVersion = ProtoVersion; } + +void Config::setServerSize(int ServerSize) { _serverSize = ServerSize; } + +void Config::setServerPort(int ServerPort) { _serverPort = ServerPort; } + +void Config::setServerMotd(std::string ServerMotd) { _serverMotd = ServerMotd; } + +void Config::setServerVersion(std::string ServerVersion) { _gameVersion = ServerVersion; } + +void Config::setServerAddress(std::string ServerAddress) { _serverAddress = ServerAddress; } + +void Config::setWorldName(std::string WorldName) { _worldName = WorldName; } + +void Config::setGamemode(std::string Gamemode) { _gamemode = Gamemode; } + +void Config::setDifficulty(std::string Difficulty) { _difficulty = Difficulty; } diff --git a/src/lib/fs.cpp b/src/lib/fs.cpp new file mode 100644 index 0000000..ea6f364 --- /dev/null +++ b/src/lib/fs.cpp @@ -0,0 +1,16 @@ +#include +#include +#include +#include +#include +#include + +std::filesystem::path getPath() { + char buffer[PATH_MAX]; + ssize_t len = readlink("/proc/self/exe", buffer, sizeof(buffer) - 1); + if (len != -1) { + buffer[len] = '\0'; + return std::filesystem::path(buffer); + } + return {}; +} diff --git a/src/id_manager.cpp b/src/lib/idManager.cpp similarity index 90% rename from src/id_manager.cpp rename to src/lib/idManager.cpp index 812b9bd..f616e1a 100644 --- a/src/id_manager.cpp +++ b/src/lib/idManager.cpp @@ -1,4 +1,4 @@ -#include "id_manager.hpp" +#include "network/id_manager.hpp" #include #include @@ -25,8 +25,7 @@ uint32_t IdManager::allocate() { void IdManager::release(uint32_t id) { std::lock_guard lock(_mutex); if (id >= _nextId) { - std::cerr << "[IdManager] WARNING: Trying to release invalid ID " << id - << " (nextId: " << _nextId << ")" << std::endl; + std::cerr << "[IdManager] WARNING: Trying to release invalid ID " << id << " (nextId: " << _nextId << ")" << std::endl; return; } if (_freedIds.find(id) != _freedIds.end()) { @@ -35,8 +34,7 @@ void IdManager::release(uint32_t id) { } _freedIds.insert(id); - std::cout << "[IdManager] Released ID: " << id << " (freed count: " << _freedIds.size() << ")" - << std::endl; + std::cout << "[IdManager] Released ID: " << id << " (freed count: " << _freedIds.size() << ")" << std::endl; } size_t IdManager::getAllocatedCount() const { diff --git a/src/logger.cpp b/src/lib/logger.cpp similarity index 80% rename from src/logger.cpp rename to src/lib/logger.cpp index b4fd564..bdc9e87 100644 --- a/src/logger.cpp +++ b/src/lib/logger.cpp @@ -1,23 +1,25 @@ #include "logger.hpp" +#include "lib/filesystem.hpp" + #include +#include #include #include #include #include +#include +#include #include +#include #include #include -#include -#include -#include -#include namespace fs = std::filesystem; LogManager::LogManager() : _running(false) { if (initializeLogDirectory()) { - _running = true; + _running = true; _writerThread = std::thread(&LogManager::writerThreadLoop, this); // Logger initialized - using console for initialization message std::cout << "Logger initialized successfully in directory: " << _logDir << std::endl; @@ -43,7 +45,7 @@ LogManager::~LogManager() { } std::string LogManager::getCurrentTimestamp() { - auto now = std::chrono::system_clock::now(); + auto now = std::chrono::system_clock::now(); auto time_t = std::chrono::system_clock::to_time_t(now); std::stringstream ss; @@ -52,9 +54,9 @@ std::string LogManager::getCurrentTimestamp() { } std::string LogManager::getDetailedTimestamp() { - auto now = std::chrono::system_clock::now(); + auto now = std::chrono::system_clock::now(); auto time_t = std::chrono::system_clock::to_time_t(now); - auto ms = std::chrono::duration_cast(now.time_since_epoch()) % 1000; + auto ms = std::chrono::duration_cast(now.time_since_epoch()) % 1000; std::stringstream ss; ss << std::put_time(std::localtime(&time_t), "%H:%M:%S"); @@ -66,7 +68,7 @@ bool LogManager::initializeLogDirectory() { std::string timestamp = getCurrentTimestamp(); // Create base logs directory - fs::path baseLogsDir = "logs"; + fs::path baseLogsDir = getPath().parent_path() / "logs"; if (!fs::exists(baseLogsDir)) { if (!fs::create_directories(baseLogsDir)) { std::cerr << "Failed to create base logs directory: " << baseLogsDir << std::endl; @@ -109,16 +111,13 @@ bool LogManager::initializeLogDirectory() { return true; } -void LogManager::log(LogLevel level, - LogCategory category, - const std::string& message, - const std::string& source) { +void LogManager::log(LogLevel level, LogCategory category, const std::string& message, const std::string& source) { LogEntry entry; entry.timestamp = std::chrono::system_clock::now(); - entry.level = level; - entry.category = category; - entry.message = message; - entry.source = source; + entry.level = level; + entry.category = category; + entry.message = message; + entry.source = source; // Add to queue for file writing { @@ -127,25 +126,19 @@ void LogManager::log(LogLevel level, } if (category == GAMEINFO || category == NETWORK) { // Remove category == NETWORK on release build - std::string formattedEntry = formatLogEntry(entry); - std::cout << formattedEntry << std::endl; + std::string formattedEntry = formatLogEntry(entry); + std::cout << formattedEntry << std::endl; } } -void LogManager::logNetwork(LogLevel level, const std::string& message, const std::string& source) { - log(level, NETWORK, message, source); -} +void LogManager::logNetwork(LogLevel level, const std::string& message, const std::string& source) { log(level, NETWORK, message, source); } -void LogManager::logGameInfo(LogLevel level, - const std::string& message, - const std::string& source) { - log(level, GAMEINFO, message, source); -} +void LogManager::logGameInfo(LogLevel level, const std::string& message, const std::string& source) { log(level, GAMEINFO, message, source); } void LogManager::writerThreadLoop() { while (_running || !_logQueue.empty()) { LogEntry entry; - bool hasEntry = false; + bool hasEntry = false; // Get entry from queue { @@ -160,7 +153,7 @@ void LogManager::writerThreadLoop() { if (hasEntry) { // Write to appropriate file std::lock_guard fileLock(_fileMutex); - std::string formattedEntry = formatLogEntry(entry); + std::string formattedEntry = formatLogEntry(entry); if (entry.category == NETWORK && _networkFile.is_open()) { _networkFile << formattedEntry << std::endl; @@ -181,9 +174,7 @@ std::string LogManager::formatLogEntry(const LogEntry& entry) { // Add timestamp auto time_t = std::chrono::system_clock::to_time_t(entry.timestamp); - auto ms = std::chrono::duration_cast( - entry.timestamp.time_since_epoch()) % - 1000; + auto ms = std::chrono::duration_cast(entry.timestamp.time_since_epoch()) % 1000; ss << "[" << std::put_time(std::localtime(&time_t), "%H:%M:%S"); ss << "." << std::setfill('0') << std::setw(3) << ms.count() << "] "; diff --git a/src/lib/nbtParser.cpp b/src/lib/nbtParser.cpp new file mode 100644 index 0000000..90237f8 --- /dev/null +++ b/src/lib/nbtParser.cpp @@ -0,0 +1,184 @@ +#include "lib/nbtParser.hpp" + +#include +#include +#include +#include +#include +#include +#include + +namespace { + constexpr uint8_t TAG_END = 0; + constexpr uint8_t TAG_BYTE = 1; + constexpr uint8_t TAG_SHORT = 2; + constexpr uint8_t TAG_INT = 3; + constexpr uint8_t TAG_LONG = 4; + constexpr uint8_t TAG_FLOAT = 5; + constexpr uint8_t TAG_DOUBLE = 6; + constexpr uint8_t TAG_BYTE_ARRAY = 7; + constexpr uint8_t TAG_STRING = 8; + constexpr uint8_t TAG_LIST = 9; + constexpr uint8_t TAG_COMPOUND = 10; + constexpr uint8_t TAG_INT_ARRAY = 11; + constexpr uint8_t TAG_LONG_ARRAY = 12; +} // namespace + +namespace nbt { + + NBT Parser::parse(const std::vector& data) { + if (data.empty()) { + throw std::runtime_error("NBT parsing error: empty data."); + } + + size_t cursor = 0; + + uint8_t rootType = read(data, cursor); + if (rootType != TAG_COMPOUND) { + throw std::runtime_error("NBT parsing error: root must be a TAG_Compound."); + } + + std::string rootName = parseTagName(data, cursor); + TagCompound rootComp = parseCompound(data, cursor); + + return NBT(rootName, rootComp); + } + + template T Parser::read(const std::vector& data, size_t& cursor) { + if (cursor + sizeof(T) > data.size()) { + throw std::runtime_error("NBT parsing error: unexpected end of data."); + } + T value; + std::memcpy(&value, &data[cursor], sizeof(T)); + cursor += sizeof(T); + + if constexpr (sizeof(T) > 1) { + if (std::endian::native == std::endian::little) { + return std::byteswap(value); + } + } + return value; + } + + // Explicit instantiations for the types we use + template int8_t Parser::read(const std::vector&, size_t&); + template uint8_t Parser::read(const std::vector&, size_t&); + template int16_t Parser::read(const std::vector&, size_t&); + template uint16_t Parser::read(const std::vector&, size_t&); + template int32_t Parser::read(const std::vector&, size_t&); + template uint32_t Parser::read(const std::vector&, size_t&); + template int64_t Parser::read(const std::vector&, size_t&); + template uint64_t Parser::read(const std::vector&, size_t&); + + std::string Parser::parseTagName(const std::vector& data, size_t& cursor) { + uint16_t length = read(data, cursor); + if (length == 0) { + return ""; + } + if (cursor + length > data.size()) { + throw std::runtime_error("NBT parsing error: invalid tag name length."); + } + std::string name(data.begin() + cursor, data.begin() + cursor + length); + cursor += length; + return name; + } + + TagCompound Parser::parseCompound(const std::vector& data, size_t& cursor) { + TagCompound compound; + while (cursor < data.size()) { + uint8_t tagType = read(data, cursor); + if (tagType == TAG_END) { + break; + } + + std::string tagName = parseTagName(data, cursor); + compound[tagName] = parseTag(data, cursor, tagType); + } + return compound; + } + + TagList Parser::parseList(const std::vector& data, size_t& cursor) { + TagList list; + uint8_t listType = read(data, cursor); + int32_t length = read(data, cursor); + + if (length < 0) { + throw std::runtime_error("NBT parsing error: negative TAG_List length."); + } + + for (int32_t i = 0; i < length; ++i) { + list.push_back(parseTag(data, cursor, listType)); + } + return list; + } + + Tag Parser::parseTag(const std::vector& data, size_t& cursor, uint8_t tagType) { + switch (tagType) { + case TAG_BYTE: + return Tag(read(data, cursor)); + case TAG_SHORT: + return Tag(read(data, cursor)); + case TAG_INT: + return Tag(read(data, cursor)); + case TAG_LONG: + return Tag(read(data, cursor)); + case TAG_FLOAT: + return Tag(std::bit_cast(read(data, cursor))); + case TAG_DOUBLE: + return Tag(std::bit_cast(read(data, cursor))); + case TAG_STRING: { + uint16_t length = read(data, cursor); + if (cursor + length > data.size()) { + throw std::runtime_error("NBT parsing error: invalid string length."); + } + std::string str(data.begin() + cursor, data.begin() + cursor + length); + cursor += length; + return Tag(str); + } + case TAG_BYTE_ARRAY: { + int32_t length = read(data, cursor); + if (length < 0) { + throw std::runtime_error("NBT parsing error: negative TAG_Byte_Array length."); + } + TagByteArray array; + if (length > 0) { + array.resize(static_cast(length)); + std::memcpy(array.data(), &data[cursor], static_cast(length)); + cursor += static_cast(length); + } + return Tag(array); + } + case TAG_INT_ARRAY: { + int32_t length = read(data, cursor); + if (length < 0) { + throw std::runtime_error("NBT parsing error: negative TAG_Int_Array length."); + } + TagIntArray array; + array.reserve(static_cast(length)); + for (int32_t i = 0; i < length; ++i) { + array.push_back(read(data, cursor)); + } + return Tag(array); + } + case TAG_LONG_ARRAY: { + int32_t length = read(data, cursor); + if (length < 0) { + throw std::runtime_error("NBT parsing error: negative TAG_Long_Array length."); + } + TagLongArray array; + array.reserve(static_cast(length)); + for (int32_t i = 0; i < length; ++i) { + array.push_back(read(data, cursor)); + } + return Tag(array); + } + case TAG_LIST: + return Tag(std::make_shared(parseList(data, cursor))); + case TAG_COMPOUND: + return Tag(std::make_shared(parseCompound(data, cursor))); + default: + throw std::runtime_error("NBT parsing error: unsupported tag type: " + std::to_string(tagType)); + } + } + +} // namespace nbt diff --git a/src/packet.cpp b/src/lib/packet.cpp similarity index 79% rename from src/packet.cpp rename to src/lib/packet.cpp index fa51478..0a8734a 100644 --- a/src/packet.cpp +++ b/src/lib/packet.cpp @@ -1,9 +1,9 @@ -#include "buffer.hpp" -#include "json.hpp" +#include "lib/json.hpp" #include "logger.hpp" -#include "packet.hpp" +#include "network/buffer.hpp" +#include "network/packet.hpp" +#include "network/server.hpp" #include "player.hpp" -#include "server.hpp" #include #include @@ -21,20 +21,17 @@ using json = nlohmann::json; Packet::~Packet() {} Packet::Packet(const Packet& other) - : _size(other._size), _id(other._id), _data(other._data), _player(other._player), - _socketFd(other._socketFd), _returnPacket(other._returnPacket) { - std::cout << "[Packet] Copy constructor called" << std::endl; + : _size(other._size), _id(other._id), _data(other._data), _player(other._player), _socketFd(other._socketFd), _returnPacket(other._returnPacket) { } Packet& Packet::operator=(const Packet& other) { if (this != &other) { - _size = other._size; - _id = other._id; - _data = other._data; - _player = other._player; - _socketFd = other._socketFd; + _size = other._size; + _id = other._id; + _data = other._data; + _player = other._player; + _socketFd = other._socketFd; _returnPacket = other._returnPacket; - std::cout << "[Packet] Assignment operator called" << std::endl; } return (*this); } @@ -50,7 +47,7 @@ Packet::Packet(Player* player) : _player(player), _socketFd(-1), _returnPacket(0 // g_logger->logNetwork(INFO, "Read size: " + std::to_string(_size), "Packet"); int idBytesRead = 0; - _id = readVarint(_socketFd, &idBytesRead); + _id = readVarint(_socketFd, &idBytesRead); if (_id == -1) throw std::runtime_error("Failed to read packet id"); // g_logger->logNetwork(INFO, "Read ID: " + std::to_string(_id), "Packet"); @@ -61,7 +58,7 @@ Packet::Packet(Player* player) : _player(player), _socketFd(-1), _returnPacket(0 if (remaining < 0) throw std::runtime_error("Invalid packet size"); if (remaining > 0) { std::vector tmp(remaining); - ssize_t totalRead = 0; + ssize_t totalRead = 0; while (totalRead < remaining) { ssize_t bytesRead = ::read(_socketFd, tmp.data() + totalRead, remaining - totalRead); @@ -80,8 +77,7 @@ Packet::Packet(Player* player) : _player(player), _socketFd(-1), _returnPacket(0 } } -Packet::Packet(int socketFd, Server& server) - : _player(nullptr), _socketFd(socketFd), _returnPacket(0) { +Packet::Packet(int socketFd, Server& server) : _player(nullptr), _socketFd(socketFd), _returnPacket(0) { // g_logger->logNetwork(INFO, "Constructor (socket): Socket FD = " + std::to_string(_socketFd), // "Packet"); @@ -90,7 +86,7 @@ Packet::Packet(int socketFd, Server& server) // g_logger->logNetwork(INFO, "Read size: " + std::to_string(_size), "Packet"); int idBytesRead = 0; - _id = readVarint(_socketFd, &idBytesRead); + _id = readVarint(_socketFd, &idBytesRead); if (_id == -1) throw std::runtime_error("Failed to read packet id"); // g_logger->logNetwork(INFO, "Read ID: " + std::to_string(_id), "Packet"); @@ -109,7 +105,7 @@ Packet::Packet(int socketFd, Server& server) if (remaining > 0) { std::vector tmp(remaining); - ssize_t totalRead = 0; + ssize_t totalRead = 0; while (totalRead < remaining) { ssize_t bytesRead = ::read(_socketFd, tmp.data() + totalRead, remaining - totalRead); @@ -130,11 +126,10 @@ Packet::Packet(int socketFd, Server& server) int Packet::getVarintSize(int32_t value) { if (value < 0) { - std::cerr << "[Packet] ERROR: getVarintSize called with negative value: " << value - << std::endl; + std::cerr << "[Packet] ERROR: getVarintSize called with negative value: " << value << std::endl; throw std::runtime_error("getVarintSize called with negative value"); } - int size = 0; + int size = 0; int original_value = value; do { value >>= 7; @@ -150,15 +145,14 @@ int Packet::readVarint(int sock, int* bytesRead) { return -1; } - int value = 0, position = 0; + int value = 0, position = 0; uint8_t byte; - int localBytesRead = 0; + int localBytesRead = 0; while (true) { ssize_t result = ::read(sock, &byte, 1); if (result <= 0) { - std::cerr << "readVarint: Failed to read byte " << localBytesRead << " from socket " - << sock << " (errno: " << errno << ")" << std::endl; + std::cerr << "readVarint: Failed to read byte " << localBytesRead << " from socket " << sock << " (errno: " << errno << ")" << std::endl; return -1; } @@ -169,15 +163,13 @@ int Packet::readVarint(int sock, int* bytesRead) { position += 7; if (position >= 32) { - std::cerr << "readVarint: Varint too long (> 32 bits) after " << localBytesRead - << " bytes" << std::endl; + std::cerr << "readVarint: Varint too long (> 32 bits) after " << localBytesRead << " bytes" << std::endl; return -1; } // Safety check to prevent infinite loops if (localBytesRead > 5) { - std::cerr << "readVarint: Too many bytes read (" << localBytesRead - << "), corrupted varint" << std::endl; + std::cerr << "readVarint: Too many bytes read (" << localBytesRead << "), corrupted varint" << std::endl; return -1; } } @@ -195,7 +187,7 @@ int Packet::readVarint(int sock) { return readVarint(sock, nullptr); } void Packet::writeVarint(int sock, int value) { std::vector tmp; - Buffer buf(tmp); + Buffer buf(tmp); buf.writeVarInt(value); (void)!::write(sock, buf.getData().data(), buf.getData().size()); } @@ -207,7 +199,7 @@ bool Packet::isSocketValid(int sock) { } struct pollfd pfd; - pfd.fd = sock; + pfd.fd = sock; pfd.events = POLLIN; int result = poll(&pfd, 1, 0); @@ -217,8 +209,7 @@ bool Packet::isSocketValid(int sock) { } if (pfd.revents & (POLLHUP | POLLERR)) { - std::cerr << "Socket validation: Socket " << sock << " is disconnected or has error" - << std::endl; + std::cerr << "Socket validation: Socket " << sock << " is disconnected or has error" << std::endl; return false; } @@ -226,7 +217,7 @@ bool Packet::isSocketValid(int sock) { } void Packet::setReturnPacket(int value) { this->_returnPacket = value; } -int Packet::getReturnPacket() { return (this->_returnPacket); } +int Packet::getReturnPacket() { return (this->_returnPacket); } int Packet::varintLen(int value) { int len = 0; @@ -237,10 +228,10 @@ int Packet::varintLen(int value) { return (len); } -Player* Packet::getPlayer() const { return (_player); } +Player* Packet::getPlayer() const { return (_player); } uint32_t Packet::getSize() { return (_size); } uint32_t Packet::getId() { return (_id); } -Buffer& Packet::getData() { return (_data); } -int Packet::getSocket() const { return (_socketFd); }; -void Packet::setPacketSize(int32_t value) { _size = value; } -void Packet::setPacketId(uint32_t value) { _id = value; } +Buffer& Packet::getData() { return (_data); } +int Packet::getSocket() const { return (_socketFd); }; +void Packet::setPacketSize(int32_t value) { _size = value; } +void Packet::setPacketId(uint32_t value) { _id = value; } diff --git a/src/main.cpp b/src/main.cpp index a51254c..df27ea9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,4 +1,4 @@ -#include "server.hpp" +#include "network/server.hpp" int main() { Server server; diff --git a/src/networking/networkManager.cpp b/src/networking/networkManager.cpp index 82be534..a7392f0 100644 --- a/src/networking/networkManager.cpp +++ b/src/networking/networkManager.cpp @@ -1,5 +1,5 @@ -#include "networking.hpp" -#include "server.hpp" +#include "network/networking.hpp" +#include "network/server.hpp" #include #include @@ -13,9 +13,8 @@ #include NetworkManager::NetworkManager(size_t workerCount, Server& s) - : _incomingPackets(), _outgoingPackets(), _workerThreads(), _shutdownFlag(false), - _receiverThread(), _senderThread(), _receiverThreadInit(0), _senderThreadInit(0), _server(s), - _epollFd(-1), _serverSocket(-1) { + : _incomingPackets(), _outgoingPackets(), _workerThreads(), _shutdownFlag(false), _receiverThread(), _senderThread(), _receiverThreadInit(0), + _senderThreadInit(0), _server(s), _epollFd(-1), _serverSocket(-1) { _workerThreads.reserve(workerCount); setupEpoll(); @@ -34,12 +33,12 @@ void NetworkManager::startThreads() { _shutdownFlag = false; if (!_receiverThreadInit) { - _receiverThread = std::thread(&NetworkManager::receiverThreadLoop, this); + _receiverThread = std::thread(&NetworkManager::receiverThreadLoop, this); _receiverThreadInit = 1; } if (!_senderThreadInit) { - _senderThread = std::thread(&NetworkManager::senderThreadLoop, this); + _senderThread = std::thread(&NetworkManager::senderThreadLoop, this); _senderThreadInit = 1; } size_t workerCount = _workerThreads.capacity(); @@ -96,12 +95,12 @@ void NetworkManager::start() { struct sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; - serverAddr.sin_port = htons(getServer().getServerPort()); + serverAddr.sin_port = htons(getServer().getConfig().getServerPort()); - if (strcmp(getServer().getServerAddr().c_str(), "0.0.0.0") == 0) { + if (strcmp(getServer().getConfig().getServerAddress().c_str(), "0.0.0.0") == 0) { serverAddr.sin_addr.s_addr = INADDR_ANY; } else { - if (inet_aton(getServer().getServerAddr().c_str(), &serverAddr.sin_addr) == 0) { + if (inet_aton(getServer().getConfig().getServerAddress().c_str(), &serverAddr.sin_addr) == 0) { close(_serverSocket); throw std::runtime_error("Invalid IP address"); } @@ -109,9 +108,8 @@ void NetworkManager::start() { if (bind(_serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) { close(_serverSocket); - throw std::runtime_error("Failed to bind socket to " + - std::string(getServer().getServerAddr()) + ":" + - std::to_string(getServer().getServerPort())); + throw std::runtime_error("Failed to bind socket to " + std::string(getServer().getConfig().getServerAddress()) + ":" + + std::to_string(getServer().getConfig().getServerPort())); } if (listen(_serverSocket, SOMAXCONN) < 0) { diff --git a/src/networking/networkPacketRouter.cpp b/src/networking/networkPacketRouter.cpp new file mode 100644 index 0000000..9249e5d --- /dev/null +++ b/src/networking/networkPacketRouter.cpp @@ -0,0 +1,370 @@ +#include "logger.hpp" +#include "network/networking.hpp" +#include "network/packet.hpp" +#include "network/server.hpp" +#include "player.hpp" + +#include + +void handleHandshakeState(Packet* packet, Server& server); +void handleStatusState(Packet* packet, Server& server); +void handleLoginState(Packet* packet, Server& server); +void handleConfigurationState(Packet* packet, Server& server); +void handlePlayState(Packet* packet, Server& server); +void sendDisconnectPacket(Packet* packet, const std::string& reason, Server& server); +void initGameSequence(Packet* packet, Server& server); +void sendRegistryData(Packet& packet, Server& server); +void sendUpdateTags(Packet& packet, Server& server); +void sendCompleteConfigurationSequence(Packet* packet, Server& server); + +// ======================================== +// Main Packet Router +// ======================================== + +void packetRouter(Packet* packet, Server& server) { + + if (packet == nullptr) return; + if (server.getNetworkManager().getOutgoingQueue() == nullptr) return; + + Player* player = packet->getPlayer(); + + if (player == nullptr) { + packet->setReturnPacket(PACKET_DISCONNECT); + return; + } + + g_logger->logNetwork(INFO, + "Routing packet ID: 0x" + std::to_string(packet->getId()) + " (size: " + std::to_string(packet->getSize()) + + ") for state: " + std::to_string(static_cast(player->getPlayerState())), + "PacketRouter"); + + switch (player->getPlayerState()) { + case PlayerState::Handshake: + handleHandshakeState(packet, server); + break; + case PlayerState::Status: + handleStatusState(packet, server); + break; + case PlayerState::Login: + handleLoginState(packet, server); + break; + case PlayerState::Configuration: + handleConfigurationState(packet, server); + break; + case PlayerState::Play: + handlePlayState(packet, server); + break; + default: + g_logger->logNetwork( + WARN, "Unknown player state: " + std::to_string(static_cast(player->getPlayerState())) + ", disconnecting", "PacketRouter"); + packet->setReturnPacket(PACKET_DISCONNECT); + break; + } +} + +// ======================================== +// Handshake State Handler +// ======================================== + +void handleHandshakeState(Packet* packet, Server& server) { handleHandshakePacket(*packet, server); } + +// ======================================== +// Status State Handler +// ======================================== + +void handleStatusState(Packet* packet, Server& server) { + if (packet->getId() == 0x00) { + handleStatusPacket(*packet, server); + } else if (packet->getId() == 0x01) { + handlePingPacket(*packet, server); + } else { + // g_logger->logNetwork(WARN, "Unknown packet ID in Status state: 0x" + std::to_string(packet->getId()), "PacketRouter"); + packet->getPlayer()->setPlayerState(PlayerState::None); + packet->setReturnPacket(PACKET_DISCONNECT); + } +} + +// ======================================== +// Login State Handler +// ======================================== + +void handleLoginState(Packet* packet, Server& server) { + ThreadSafeQueue* outgoingPackets = server.getNetworkManager().getOutgoingQueue(); + // Add safety check for packet data integrity + if (packet->getSize() > 32767) { // Max packet size + g_logger->logNetwork(ERROR, "Packet size too large: " + std::to_string(packet->getSize()), "PacketRouter"); + packet->setReturnPacket(PACKET_DISCONNECT); + return; + } + + if (packet->getId() == 0x00) { + // Login Start + g_logger->logNetwork(INFO, "Processing Login Start (0x00)", "PacketRouter"); + handleLoginStartPacket(*packet, server); + } else if (packet->getId() == 0x02) { + // Login Plugin Response - safe to ignore most of the time + g_logger->logNetwork(INFO, "Received Login Plugin Response (0x02) - acknowledging", "PacketRouter"); + packet->setReturnPacket(PACKET_OK); + } else if (packet->getId() == 0x03) { + // Login Acknowledged + g_logger->logNetwork(INFO, "Processing Login Acknowledged (0x03)", "PacketRouter"); + handleLoginAcknowledged(*packet, server); + Packet* p = new Packet(*packet); + clientboundKnownPacks(*p); + outgoingPackets->push(p); + } else if (packet->getId() == 0x04) { + // Cookie Response (login) + g_logger->logNetwork(INFO, "Received Login Cookie Response (0x04) - acknowledging", "PacketRouter"); + packet->setReturnPacket(PACKET_OK); + } else { + // g_logger->logNetwork(WARN, "Unknown packet ID in Login state: 0x" + std::to_string(packet->getId()), "PacketRouter"); + packet->getPlayer()->setPlayerState(PlayerState::None); + packet->setReturnPacket(PACKET_DISCONNECT); + } +} + +// ======================================== +// Configuration State Handler +// ======================================== + +void handleConfigurationState(Packet* packet, Server& server) { + if (packet->getId() == 0x00) { + // Client Information (configuration) + g_logger->logNetwork(INFO, "Received Client Information in Configuration state", "Configuration"); + handleClientInformation(*packet, server); + } else if (packet->getId() == 0x01) { + // Cookie Response (configuration) + g_logger->logNetwork(INFO, "Received Cookie Response in Configuration state", "Configuration"); + packet->setReturnPacket(PACKET_OK); + + } else if (packet->getId() == 0x02) { + // Serverbound Plugin Message (configuration) + // g_logger->logNetwork( + // INFO, "Received Serverbound Plugin Message (0x02), size: " + std::to_string(packet->getSize()) + " bytes", "PacketRouter"); + packet->setReturnPacket(PACKET_OK); + + } else if (packet->getId() == 0x03) { + // Acknowledge Finish Configuration -> enter Play + g_logger->logNetwork(INFO, "Received Acknowledge Finish Configuration - transitioning to Play state", "PacketRouter"); + handleAcknowledgeFinishConfiguration(*packet, server); + + // 1. Send Login (play) packet - 0x2B + g_logger->logNetwork(INFO, "Sending Login (play) packet", "PacketRouter"); + Packet* playPacket = new Packet(*packet); + writePlayPacket(*playPacket, server); + server.getNetworkManager().getOutgoingQueue()->push(playPacket); + + // 3. Send Change Difficulty - 0x42 + g_logger->logNetwork(INFO, "Sending Change Difficulty packet", "PacketRouter"); + Packet* difficultyPacket = new Packet(*packet); + changeDifficulty(*difficultyPacket); + server.getNetworkManager().getOutgoingQueue()->push(difficultyPacket); + + // 4. Send Player Abilities - 0x39 + g_logger->logNetwork(INFO, "Sending Player Abilities packet", "PacketRouter"); + Packet* abilitiesPacket = new Packet(*packet); + playerAbilities(*abilitiesPacket); + server.getNetworkManager().getOutgoingQueue()->push(abilitiesPacket); + + Packet* heldItemPacket = new Packet(*packet); + setHeldItem(*heldItemPacket); + server.getNetworkManager().getOutgoingQueue()->push(heldItemPacket); + + // 2. Send player position and look - 0x41 + Packet* positionPacket = new Packet(*packet); + sendPlayerPositionAndLook(*positionPacket, server); // rename packet + server.getNetworkManager().getOutgoingQueue()->push(positionPacket); + + } else if (packet->getId() == 0x04) { + // Keep Alive (configuration) + g_logger->logNetwork(INFO, "Received Keep Alive in Configuration state", "Configuration"); + packet->setReturnPacket(PACKET_OK); + + } else if (packet->getId() == 0x05) { + // Pong (configuration) + g_logger->logNetwork(INFO, "Received Pong in Configuration state", "Configuration"); + packet->setReturnPacket(PACKET_OK); + + } else if (packet->getId() == 0x06) { + // Resource Pack Response (configuration) + g_logger->logNetwork(INFO, "Received Resource Pack Response in Configuration state", "Configuration"); + packet->setReturnPacket(PACKET_OK); + + } else if (packet->getId() == 0x07) { + // Serverbound Known Packs (configuration) + g_logger->logNetwork(INFO, "Received Serverbound Known Packs in Configuration state", "Configuration"); + serverboundKnownPacks(*packet); + + packet->setReturnPacket(PACKET_OK); + + // Send complete configuration sequence + sendCompleteConfigurationSequence(packet, server); + + } else if (packet->getId() == 0x08) { + // Custom Click Action (configuration) + g_logger->logNetwork(INFO, "Serverbound known packs", "Configuration"); + packet->setReturnPacket(PACKET_OK); + + } else { + // g_logger->logNetwork(WARN, "Unknown packet ID in Configuration state: 0x" + std::to_string(packet->getId()), "PacketRouter"); + sendDisconnectPacket(packet, "Unknown packet in Configuration state", server); + packet->getPlayer()->setPlayerState(PlayerState::None); + packet->setReturnPacket(PACKET_DISCONNECT); + } +} + +// ======================================== +// Play State Handler +// ======================================== + +void handlePlayState(Packet* packet, Server& server) { + if (packet->getId() == 0x00) { + // Confirm Teleportation + handleConfirmTeleportation(*packet, server); + + // Send Game Event packet - 0x42 + g_logger->logNetwork(INFO, "Sending Game Event packet", "PacketRouter"); + Packet* gameEvent = new Packet(*packet); + gameEventPacket(*gameEvent, server); + server.getNetworkManager().getOutgoingQueue()->push(gameEvent); + + // 2. Send Set Center Chunk - 0x57 + // Packet* setCenterPacket = new Packet(*packet); + // writeSetCenterPacket(*setCenterPacket, server); + // server.getNetworkManager().getOutgoingQueue()->push(setCenterPacket); + + // 3. Send Level Chunk With Light - 0x22 + // Packet* levelChunkPacket = new Packet(*packet); + // levelChunkWithLight(*levelChunkPacket, server); + // server.getNetworkManager().getOutgoingQueue()->push(levelChunkPacket); + + } else if (packet->getId() == 0x2B) { + // Playere loaded + g_logger->logNetwork(DEBUG, "Player Load========================", "PacketRouter"); + packet->setReturnPacket(PACKET_OK); + } else { + // Other play packets + // g_logger->logNetwork(INFO, "Received packet ID: " + std::to_string(packet->getId()) + " + // in Play state", "Play"); + packet->setReturnPacket(PACKET_OK); + } +} + +// ======================================== +// Disconnect Packet Creation +// ======================================== + +void sendDisconnectPacket(Packet* packet, const std::string& reason, Server& server) { + ThreadSafeQueue* outgoingPackets = server.getNetworkManager().getOutgoingQueue(); + if (!packet || !outgoingPackets) return; + + Player* player = packet->getPlayer(); + if (!player) return; + + g_logger->logNetwork(INFO, "Sending disconnect packet to player with reason: " + reason, "PacketRouter"); + + try { + // Create Disconnect packet (0x02 in Configuration state) + Buffer payload; + payload.writeVarInt(0x02); // Disconnect packet ID + + // Create JSON reason + std::string jsonReason = "{\"text\":\"" + reason + "\"}"; + payload.writeString(jsonReason); + + Buffer final; + final.writeVarInt(payload.getData().size()); + final.writeBytes(payload.getData()); + + // Create new packet for disconnect + Packet* disconnectPacket = new Packet(*packet); + disconnectPacket->getData() = final; + disconnectPacket->setReturnPacket(PACKET_SEND); + disconnectPacket->setPacketSize(final.getData().size()); + + outgoingPackets->push(disconnectPacket); + + g_logger->logNetwork(INFO, "Disconnect packet queued for sending", "PacketRouter"); + } catch (const std::exception& e) { + g_logger->logNetwork(ERROR, "Error creating disconnect packet: " + std::string(e.what()), "PacketRouter"); + } +} + +// ======================================== +// Game Initialization Sequence +// ======================================== + +void initGameSequence(Packet* packet, Server& server) { + if (packet == nullptr || server.getNetworkManager().getOutgoingQueue() == nullptr) return; + + Player* player = packet->getPlayer(); + if (player == nullptr) return; + + // Player should already be in Play state at this point + g_logger->logNetwork(INFO, "Starting game sequence for player: " + player->getPlayerName(), "PacketRouter"); + + try { + + // 5. Send spawn position - 0x5A + // Packet* spawnPacket = new Packet(*packet); + // sendSpawnPosition(*spawnPacket, server); + // server.getNetworkManager().getOutgoingQueue()->push(spawnPacket); + + // // 6. Complete spawn sequence (abilities, health, experience, time, held item) + completeSpawnSequence(*packet, server); + + g_logger->logNetwork(INFO, "Complete game sequence sent to player: ", "PacketRouter"); + + packet->setReturnPacket(PACKET_OK); + } catch (const std::exception& e) { + g_logger->logNetwork(ERROR, "Error in game sequence: " + std::string(e.what()), "PacketRouter"); + packet->setReturnPacket(PACKET_ERROR); + } +} + +// ======================================== +// Complete Configuration Sequence +// ======================================== + +void sendCompleteConfigurationSequence(Packet* packet, Server& server) { + if (!packet || !server.getNetworkManager().getOutgoingQueue()) { + g_logger->logNetwork(ERROR, "Invalid packet or server in configuration sequence", "Configuration"); + return; + } + + Player* player = packet->getPlayer(); + if (!player) { + g_logger->logNetwork(ERROR, "No player found for configuration sequence", "Configuration"); + return; + } + + g_logger->logNetwork(INFO, "=== Starting Complete Configuration Sequence ===", "Configuration"); + + try { + // 1. Send Registry Data (this will queue multiple packets, one per registry) + g_logger->logNetwork(INFO, "Step 1: Sending Registry Data", "Configuration"); + sendRegistryData(*packet, server); + + // 2. Send Update Tags after Registry Data + g_logger->logNetwork(INFO, "Step 2: Sending Update Tags", "Configuration"); + sendUpdateTags(*packet, server); + + // 3. TODO: Add other configuration packets here if needed + // - Feature Flags + // - Data Packs + // - Resource Packs + // - Custom Payloads + + // 4. Send Finish Configuration to complete the sequence + g_logger->logNetwork(INFO, "Step 3: Sending Finish Configuration", "Configuration"); + Packet* finishPacket = new Packet(*packet); + handleFinishConfiguration(*finishPacket, server); + server.getNetworkManager().getOutgoingQueue()->push(finishPacket); + + g_logger->logNetwork(INFO, "=== Configuration Sequence Completed Successfully ===", "Configuration"); + + } catch (const std::exception& e) { + g_logger->logNetwork(ERROR, "Error in configuration sequence: " + std::string(e.what()), "Configuration"); + packet->setReturnPacket(PACKET_ERROR); + } +} diff --git a/src/networking/networkQueuer.cpp b/src/networking/networkQueuer.cpp index 43b36d8..00352d0 100644 --- a/src/networking/networkQueuer.cpp +++ b/src/networking/networkQueuer.cpp @@ -1,8 +1,8 @@ #include "logger.hpp" -#include "networking.hpp" -#include "packet.hpp" +#include "network/networking.hpp" +#include "network/packet.hpp" +#include "network/server.hpp" #include "player.hpp" -#include "server.hpp" #include #include @@ -16,7 +16,7 @@ #include void NetworkManager::receiverThreadLoop() { - const int MaxEvent = 256; + const int MaxEvent = 256; epoll_event events[MaxEvent]; while (!_shutdownFlag.load()) { @@ -28,13 +28,13 @@ void NetworkManager::receiverThreadLoop() { } for (int i = 0; i < eventCount; i++) { - int fd = events[i].data.fd; + int fd = events[i].data.fd; uint32_t eventFlags = events[i].events; if (fd == _serverSocket) { sockaddr_in client_addr{}; - socklen_t addr_len = sizeof(client_addr); - int client_fd = accept(_serverSocket, (sockaddr*)&client_addr, &addr_len); + socklen_t addr_len = sizeof(client_addr); + int client_fd = accept(_serverSocket, (sockaddr*)&client_addr, &addr_len); if (client_fd != -1) { // g_logger->logNetwork(INFO, "New connection accepted on socket " + // std::to_string(client_fd), "Network Manager"); @@ -42,16 +42,15 @@ void NetworkManager::receiverThreadLoop() { event.events = EPOLLIN; event.data.fd = client_fd; if (epoll_ctl(_epollFd, EPOLL_CTL_ADD, client_fd, &event) == -1) { - std::cerr << "[Network Manager] Failed to add new client socket to epoll" - << std::endl; + std::cerr << "[Network Manager] Failed to add new client socket to epoll" << std::endl; close(client_fd); } } continue; } - auto it = getServer().getPlayerLst().find(fd); - Player* p = nullptr; + auto it = getServer().getPlayerLst().find(fd); + Player* p = nullptr; if (it != getServer().getPlayerLst().end()) { p = it->second; } else { @@ -91,8 +90,8 @@ void NetworkManager::senderThreadLoop() { try { // g_logger->logNetwork(INFO, "Sending packet to player", "Network Manager"); - std::cout << "Sending packet 0x" << std::hex << p->getId() << " (" << std::dec - << p->getData().getData().size() << " bytes)" << std::endl; + std::cout << "Sending packet 0x" << std::hex << p->getId() << " (" << std::dec << p->getData().getData().size() << " bytes)" + << std::endl; send(p->getSocket(), p->getData().getData().data(), p->getSize(), MSG_NOSIGNAL); if (p->getPlayer() && p->getPlayer()->getPlayerState() == PlayerState::None) { diff --git a/src/networking/networkWorker.cpp b/src/networking/networkWorker.cpp index ad7a5df..4909e72 100644 --- a/src/networking/networkWorker.cpp +++ b/src/networking/networkWorker.cpp @@ -1,8 +1,8 @@ #include "logger.hpp" -#include "networking.hpp" -#include "packet.hpp" +#include "network/networking.hpp" +#include "network/packet.hpp" +#include "network/server.hpp" #include "player.hpp" -#include "server.hpp" #include #include @@ -19,7 +19,7 @@ void NetworkManager::workerThreadLoop() { try { // g_logger->logNetwork(INFO, "Handling incoming data for player", "Worker"); - packetRouter(packet, getServer(), &_outgoingPackets); + packetRouter(packet, getServer()); if (packet->getReturnPacket() == PACKET_SEND) { _outgoingPackets.push(packet); packet = nullptr; diff --git a/src/networking/packet/chunkBatch.cpp b/src/networking/packet/chunkBatch.cpp index 455d6e7..6ff67d1 100644 --- a/src/networking/packet/chunkBatch.cpp +++ b/src/networking/packet/chunkBatch.cpp @@ -1,26 +1,29 @@ -#include "UUID.hpp" -#include "buffer.hpp" -#include "networking.hpp" -#include "packet.hpp" +#include "lib/UUID.hpp" +#include "network/buffer.hpp" +#include "network/networking.hpp" +#include "network/packet.hpp" +#include "network/server.hpp" #include "player.hpp" -#include "server.hpp" #include void sendChunkBatchStart(Packet& packet, Server& server) { std::cout << "=== Sending Chunk Batch Start ===\n"; - Buffer buf; // pas de donnΓ©es pour ce packet - - int packetId = 0x0C; // Chunk Batch Start packet ID + // Chunk Batch Start has no fields - just the packet ID + Buffer buf; + // No data to write for this packet - Buffer payload; - payload.writeVarInt(packetId); // packet ID - payload.writeBytes(buf.getData()); // aucune donnΓ©e ici + int packetId = 0x0C; // Chunk Batch Start packet ID for protocol 770 + int packetIdSize = packet.getVarintSize(packetId); + int totalPayloadSize = packetIdSize + buf.getData().size(); Buffer finalBuf; - finalBuf.writeVarInt(payload.getData().size()); // taille totale - finalBuf.writeBytes(payload.getData()); + finalBuf.writeVarInt(totalPayloadSize); + finalBuf.writeVarInt(packetId); + if (!buf.getData().empty()) { + finalBuf.writeBytes(buf.getData()); + } packet.getData() = finalBuf; packet.setPacketSize(finalBuf.getData().size()); @@ -33,17 +36,16 @@ void sendChunkBatchFinished(Packet& packet, Server& server, int batchSize) { std::cout << "=== Sending Chunk Batch Finished (batch size: " << batchSize << ") ===\n"; Buffer buf; - buf.writeVarInt(batchSize); // nombre de chunks dans le batch - - int packetId = 0x0B; // Chunk Batch Finished packet ID + buf.writeVarInt(batchSize); // Number of chunks in the batch - Buffer payload; - payload.writeVarInt(packetId); // packet ID - payload.writeBytes(buf.getData()); + int packetId = 0x0B; // Chunk Batch Finished packet ID for protocol 770 + int packetIdSize = packet.getVarintSize(packetId); + int totalPayloadSize = packetIdSize + buf.getData().size(); Buffer finalBuf; - finalBuf.writeVarInt(payload.getData().size()); // taille totale - finalBuf.writeBytes(payload.getData()); + finalBuf.writeVarInt(totalPayloadSize); + finalBuf.writeVarInt(packetId); + finalBuf.writeBytes(buf.getData()); packet.getData() = finalBuf; packet.setPacketSize(finalBuf.getData().size()); @@ -52,21 +54,16 @@ void sendChunkBatchFinished(Packet& packet, Server& server, int batchSize) { (void)server; } -void sendChunkBatchSequence(Packet& packet, - Server& server, - ThreadSafeQueue* outgoingPackets) { - Player* player = packet.getPlayer(); +void sendChunkBatchSequence(Packet& packet, Server& server) { + Player* player = packet.getPlayer(); + ThreadSafeQueue* outgoingPackets = server.getNetworkManager().getOutgoingQueue(); if (!player || !outgoingPackets) return; - ; - // Get view distance from player config - // int viewDistance = 5; // Default - // if (player->getPlayerConfig()) { - // viewDistance = player->getPlayerConfig()->getViewDistance(); - // } + int playerChunkX = 0; + int playerChunkZ = 0; + int viewDistance = 3; // Reasonable size - // std::cout << "=== Starting chunk batch sequence for player: " << player->getPlayerName() - // << " (view distance: " << viewDistance << ") ===\n"; + std::cout << "=== Starting chunk batch sequence for player: " << player->getPlayerName() << " (view distance: " << viewDistance << ") ===\n"; // 1. Send Chunk Batch Start try { @@ -78,41 +75,50 @@ void sendChunkBatchSequence(Packet& packet, return; } - static int i = 0; + // 2. Send chunks in smaller batches + int chunksCount = 0; + int batchSize = 0; + const int MAX_BATCH_SIZE = 16; // Limit chunks per batch - // Player spawn position (you should get this from player data) - int playerChunkX = 0; // player->getChunkX(); - int playerChunkZ = 0; // player->getChunkZ() - int viewDistance = 5; - int chunksCount = 0; - int startX = playerChunkX - viewDistance; - int endX = playerChunkX + viewDistance; - int startZ = playerChunkZ - viewDistance; - int endZ = playerChunkZ + viewDistance; - - for (int x = startX; x <= endX; x++) { - for (int z = startZ; z <= endZ; z++) { + for (int x = playerChunkX - viewDistance; x <= playerChunkX + viewDistance; x++) { + for (int z = playerChunkZ - viewDistance; z <= playerChunkZ + viewDistance; z++) { try { - i++; Packet* chunkPacket = new Packet(packet); sendChunkData(*chunkPacket, server, x, z); outgoingPackets->push(chunkPacket); chunksCount++; + batchSize++; + + // Send batch finished and start new batch if we hit limit + if (batchSize >= MAX_BATCH_SIZE) { + // Send batch finished + Packet* batchFinishedPacket = new Packet(packet); + sendChunkBatchFinished(*batchFinishedPacket, server, batchSize); + outgoingPackets->push(batchFinishedPacket); + + // Start new batch + Packet* batchStartPacket = new Packet(packet); + sendChunkBatchStart(*batchStartPacket, server); + outgoingPackets->push(batchStartPacket); + + batchSize = 0; + } + } catch (const std::exception& e) { - std::cerr << "Error sending chunk (" << x << ", " << z << "): " << e.what() - << std::endl; + std::cerr << "Error sending chunk (" << x << ", " << z << "): " << e.what() << std::endl; } } } - // 3. Send Chunk Batch Finished - try { - Packet* batchFinishedPacket = new Packet(packet); - sendChunkBatchFinished(*batchFinishedPacket, server, chunksCount); - outgoingPackets->push(batchFinishedPacket); - } catch (const std::exception& e) { - std::cerr << "Error sending chunk batch finished: " << e.what() << std::endl; - return; + // 3. Send final batch finished + if (batchSize > 0) { + try { + Packet* batchFinishedPacket = new Packet(packet); + sendChunkBatchFinished(*batchFinishedPacket, server, batchSize); + outgoingPackets->push(batchFinishedPacket); + } catch (const std::exception& e) { + std::cerr << "Error sending chunk batch finished: " << e.what() << std::endl; + } } std::cout << "=== Chunk batch sequence completed: " << chunksCount << " chunks sent ===\n"; diff --git a/src/networking/packet/chunkDataSimple.cpp b/src/networking/packet/chunkDataSimple.cpp index 23e3c6c..d42cd9d 100644 --- a/src/networking/packet/chunkDataSimple.cpp +++ b/src/networking/packet/chunkDataSimple.cpp @@ -1,89 +1,175 @@ -#include "UUID.hpp" -#include "buffer.hpp" -#include "networking.hpp" -#include "packet.hpp" +#include "lib/UUID.hpp" +#include "network/buffer.hpp" +#include "network/networking.hpp" +#include "network/packet.hpp" +#include "network/server.hpp" #include "player.hpp" -#include "server.hpp" #include void sendChunkData(Packet& packet, Server& server, int chunkX, int chunkZ) { + std::cout << "=== Sending Chunk Data (" << chunkX << ", " << chunkZ << ") ===\n"; + Buffer buf; - // --- Coordinates --- - buf.writeInt(chunkX); - buf.writeInt(chunkZ); - - // --- Heightmaps (NBT minimal valide) --- - Buffer nbt; - nbt.writeByte(0x0A); // TAG_Compound - nbt.writeShort(0); // name length = 0 - nbt.writeByte(0x00); // TAG_End - buf.writeBytes(nbt.getData()); - - // --- Chunk Sections --- - Buffer chunkData; - const int SECTION_COUNT = 24; - - for (int sectionY = 0; sectionY < SECTION_COUNT; ++sectionY) { - bool hasDirt = (sectionY == 4); - - if (hasDirt) { - chunkData.writeShort(4096); // non-air count - chunkData.writeByte(8); // bits per block - chunkData.writeVarInt(2); // palette length - chunkData.writeVarInt(0); // air - chunkData.writeVarInt(3); // dirt - chunkData.writeVarInt(16 * 16 * 16 / (64 / 8)); // data array length - - for (int i = 0; i < 4096; i++) { - chunkData.writeByte(1); // palette index for dirt - } + try { + // Use your new chunk loading system + World::Query query = server.getWorldQuery(); + World::ChunkData chunkData = query.fetchChunk(chunkX, chunkZ); + + // Write chunk coordinates + buf.writeInt(chunkX); + buf.writeInt(chunkZ); + + // Write heightmaps (simplified) + if (!chunkData.heightmaps.empty()) { + buf.writeBytes(chunkData.heightmaps); } else { - chunkData.writeShort(0); - chunkData.writeByte(0); - chunkData.writeVarInt(1); - chunkData.writeVarInt(0); - chunkData.writeVarInt(0); + // Empty heightmap + buf.writeByte(0x0A); // Compound tag + buf.writeByte(0x00); // Empty name length + buf.writeByte(0x00); // End tag } - // Biomes - chunkData.writeByte(0); - chunkData.writeVarInt(1); - chunkData.writeVarInt(1); - chunkData.writeVarInt(0); - } - - buf.writeVarInt(chunkData.getData().size()); - buf.writeBytes(chunkData.getData()); + // Write chunk data + if (!chunkData.blockData.empty()) { + buf.writeVarInt(chunkData.blockData.size()); + buf.writeBytes(chunkData.blockData); + } else { + // Generate simple empty chunk inline + Buffer emptyData; + const int NUM_SECTIONS = 24; + + for (int section = 0; section < NUM_SECTIONS; section++) { + emptyData.writeByte(0x00); // Block count low + emptyData.writeByte(0x00); // Block count high + + // Block states - single air block + emptyData.writeByte(0); // Bits per entry + emptyData.writeVarInt(0); // Air block state + emptyData.writeVarInt(0); // No data array + + // Biomes - single plains biome + emptyData.writeByte(0); // Bits per entry + emptyData.writeVarInt(1); // Plains biome + emptyData.writeVarInt(0); // No data array + } - // No block entities - buf.writeVarInt(0); + buf.writeVarInt(emptyData.getData().size()); + buf.writeBytes(emptyData.getData()); + } - // Minimal light data - buf.writeVarInt(0); // sky mask - buf.writeVarInt(0); // block mask - buf.writeVarInt(0); // empty sky mask - buf.writeVarInt(0); // empty block mask + // Block entities + buf.writeVarInt(0); + + // Light data (simplified version) + buf.writeVarInt(1); // Sky light mask length + buf.writeLong(0x1FFFFFF); // All sections have sky light + buf.writeVarInt(1); // Block light mask length + buf.writeLong(0); // No block light + buf.writeVarInt(1); // Empty sky light mask length + buf.writeLong(0); // No empty sky light sections + buf.writeVarInt(1); // Empty block light mask length + buf.writeLong(0); // No empty block light sections + + // Sky light arrays + for (int i = 0; i < 25; i++) { + buf.writeVarInt(2048); + for (int j = 0; j < 2048; j++) { + buf.writeByte(0xFF); + } + } - // --- Finalize packet --- - int packetId = 0x27; + } catch (const std::exception& e) { + std::cerr << "Error in sendChunkData: " << e.what() << std::endl; + // Return without setting packet data - this will cause the packet to be skipped + return; + } - Buffer payload; - payload.writeVarInt(packetId); // packet ID first - payload.writeBytes(buf.getData()); // then packet data + // Create final packet + int packetId = 0x27; + int packetIdSize = packet.getVarintSize(packetId); + int totalPayloadSize = packetIdSize + buf.getData().size(); Buffer finalBuf; - finalBuf.writeVarInt(payload.getData().size()); // total length prefix - finalBuf.writeBytes(payload.getData()); + finalBuf.writeVarInt(totalPayloadSize); + finalBuf.writeVarInt(packetId); + finalBuf.writeBytes(buf.getData()); packet.getData() = finalBuf; - packet.setPacketId(packetId); packet.setPacketSize(finalBuf.getData().size()); packet.setReturnPacket(PACKET_SEND); - std::cout << "Chunk (" << chunkX << ", " << chunkZ - << ") built, size = " << finalBuf.getData().size() << " bytes\n"; + (void)server; +} + +// Helper function to generate empty chunk sections +Buffer generateEmptyChunkSections() { + Buffer chunkData; + const int NUM_SECTIONS = 24; // Sections for world height -64 to 319 + + for (int section = 0; section < NUM_SECTIONS; section++) { + // Block count (non-air blocks) - 0 for empty sections + chunkData.writeByte(0x00); + chunkData.writeByte(0x00); + + // Block states palette - single entry for air + chunkData.writeByte(0); // Bits per entry (0 = single valued) + chunkData.writeVarInt(0); // Air block state ID + chunkData.writeVarInt(0); // No data array needed for single valued + + // Biomes palette - single entry for plains + chunkData.writeByte(0); // Bits per entry (0 = single valued) + chunkData.writeVarInt(1); // Plains biome ID + chunkData.writeVarInt(0); // No data array needed for single valued + } + + return chunkData; +} + +// Helper function to write light data from loaded chunk +void writeLightData(Buffer& buf, const World::ChunkData& chunkData) { + if (!chunkData.skyLight.empty() || !chunkData.blockLight.empty()) { + // Use actual light data from chunk + writeActualLightData(buf, chunkData); + } else { + // Fallback to default light data + writeEmptyLightData(buf); + } +} + +void writeActualLightData(Buffer& buf, const World::ChunkData& chunkData) { + // This is complex - you need to reconstruct the light data format + // For now, fallback to empty light data + // TODO: Implement proper light data reconstruction from chunkData.skyLight and chunkData.blockLight + writeEmptyLightData(buf); +} + +void writeEmptyLightData(Buffer& buf) { + // Sky Light Mask (BitSet) - all sections have sky light + buf.writeVarInt(1); + buf.writeLong(0x1FFFFFF); + + // Block Light Mask (BitSet) - no block light + buf.writeVarInt(1); + buf.writeLong(0); + + // Empty Sky Light Mask + buf.writeVarInt(1); + buf.writeLong(0); + + // Empty Block Light Mask + buf.writeVarInt(1); + buf.writeLong(0); + + // Sky Light arrays (2048 bytes each for sections with sky light) + for (int i = 0; i < 25; i++) { + buf.writeVarInt(2048); + for (int j = 0; j < 2048; j++) { + buf.writeByte(0xFF); // Full sky light + } + } + // No Block Light arrays since mask is 0 } void sendPlayerPositionAndLook(Packet& packet, Server& server) { @@ -94,10 +180,11 @@ void sendPlayerPositionAndLook(Packet& packet, Server& server) { // Teleport ID buf.writeVarInt(1); - // Player position (double encoded via int64_t bits) - int64_t x_bits = 0x3FE0000000000000; // 0.5 - int64_t y_bits = 0x4050000000000000; // 64.0 - int64_t z_bits = 0x3FE0000000000000; // 0.5 + // Player position (using writeLong for double precision storage) + // Note: This is a simplified approach - ideally you'd add writeDouble to Buffer + int64_t x_bits = 0x3FE0000000000000; + int64_t y_bits = 0x4050000000000000; + int64_t z_bits = 0x3FE0000000000000; buf.writeLong(x_bits); buf.writeLong(y_bits); @@ -108,27 +195,23 @@ void sendPlayerPositionAndLook(Packet& packet, Server& server) { buf.writeLong(0); buf.writeLong(0); - // Rotation (using int for float storage) + // Rotation (using writeInt for float storage) buf.writeInt(0); buf.writeInt(0); // Flags (0x00 = absolute positioning) buf.writeInt(0x00); - // --- Finalize packet --- - int packetId = 0x41; + int packetId = 0x41; + int packetIdSize = packet.getVarintSize(packetId); + int totalPayloadSize = packetIdSize + buf.getData().size(); - Buffer payload; - payload.writeVarInt(packetId); // write packet ID first - payload.writeBytes(buf.getData()); // then write packet data - - // The length prefix is the size of payload (packetId + data) Buffer finalBuf; - finalBuf.writeVarInt(payload.getData().size()); - finalBuf.writeBytes(payload.getData()); + finalBuf.writeVarInt(totalPayloadSize); + finalBuf.writeVarInt(packetId); + finalBuf.writeBytes(buf.getData()); packet.getData() = finalBuf; - packet.setPacketId(packetId); packet.setPacketSize(finalBuf.getData().size()); packet.setReturnPacket(PACKET_SEND); @@ -141,25 +224,23 @@ void sendSpawnPosition(Packet& packet, Server& server) { Buffer buf; // Encode position as long (X=0, Y=64, Z=0 packed into 64 bits) + // Position format: ((x & 0x3FFFFFF) << 38) | ((z & 0x3FFFFFF) << 12) | (y & 0xFFF) int64_t encodedPos = ((int64_t)0 << 38) | ((int64_t)0 << 12) | (64 & 0xFFF); buf.writeLong(encodedPos); // Spawn angle (0.0f as int bits) buf.writeInt(0); - // --- Finalize packet --- - int packetId = 0x5A; - - Buffer payload; - payload.writeVarInt(packetId); - payload.writeBytes(buf.getData()); + int packetId = 0x5A; // Set Default Spawn Position packet ID for protocol 770 + int packetIdSize = packet.getVarintSize(packetId); + int totalPayloadSize = packetIdSize + buf.getData().size(); Buffer finalBuf; - finalBuf.writeVarInt(payload.getData().size()); - finalBuf.writeBytes(payload.getData()); + finalBuf.writeVarInt(totalPayloadSize); + finalBuf.writeVarInt(packetId); + finalBuf.writeBytes(buf.getData()); packet.getData() = finalBuf; - packet.setPacketId(packetId); packet.setPacketSize(finalBuf.getData().size()); packet.setReturnPacket(PACKET_SEND); diff --git a/src/networking/packet/clientbound/FinishConfiguration.cpp b/src/networking/packet/clientbound/FinishConfiguration.cpp new file mode 100644 index 0000000..06e6ada --- /dev/null +++ b/src/networking/packet/clientbound/FinishConfiguration.cpp @@ -0,0 +1,35 @@ +#include "network/networking.hpp" +#include "network/packet.hpp" +#include "network/server.hpp" +#include "player.hpp" + +void handleFinishConfiguration(Packet& packet, Server& server) { + // g_logger->logNetwork(INFO, "Starting configuration finish sequence", "Configuration"); + + Player* player = packet.getPlayer(); + if (!player) { + // g_logger->logNetwork(ERROR, "Error: No player associated with packet", "Configuration"); + packet.setReturnPacket(PACKET_DISCONNECT); + return; + } + + // g_logger->logNetwork(INFO, "Sending Finish Configuration packet to " + + // player->getPlayerName(), "Configuration"); + + // Send Finish Configuration packet (0x03) + Buffer payload; + payload.writeVarInt(0x03); // Finish Configuration packet ID + + Buffer final; + final.writeVarInt(payload.getData().size()); + final.writeBytes(payload.getData()); + + packet.getData() = final; + packet.setReturnPacket(PACKET_SEND); + packet.setPacketSize(final.getData().size()); + + // g_logger->logNetwork(INFO, "Finish Configuration packet sent, waiting for client + // acknowledgment", "Configuration"); + + (void)server; // Suppress unused parameter warning +} diff --git a/src/networking/packet/clientbound/changeDifficulty.cpp b/src/networking/packet/clientbound/changeDifficulty.cpp new file mode 100644 index 0000000..817325f --- /dev/null +++ b/src/networking/packet/clientbound/changeDifficulty.cpp @@ -0,0 +1,18 @@ +#include "buffer.hpp" +#include "packet.hpp" + +void changeDifficulty(Packet& packet) { + Buffer buff; + + buff.writeByte(0x0A); + buff.writeByte(2); // 0 Peaceful; 1 Easy; 2 Normal; 3 Hard + buff.writeBool(true); // Is Difficulty locked ? + + Buffer final; + final.writeVarInt(buff.getData().size()); + final.writeBytes(buff.getData()); + + packet.getData() = final; + packet.setPacketSize(final.getData().size()); + packet.setReturnPacket(PACKET_SEND); +} diff --git a/src/networking/packet/clientbound/clientboundKnowPacks.cpp b/src/networking/packet/clientbound/clientboundKnowPacks.cpp new file mode 100644 index 0000000..9ab7781 --- /dev/null +++ b/src/networking/packet/clientbound/clientboundKnowPacks.cpp @@ -0,0 +1,21 @@ +#include "buffer.hpp" +#include "network/packet.hpp" + +// If implementing data packs we should actually send datapack info with the loaded datapacks +void clientboundKnownPacks(Packet& packet) { + Buffer buffer; + + buffer.writeByte(0x0E); + buffer.writeVarInt(1); + buffer.writeString("minecraft"); + buffer.writeString("core"); + buffer.writeString("1.21.5"); + + Buffer final; + final.writeVarInt(buffer.getData().size()); + final.writeBytes(buffer.getData()); + + packet.getData() = final; + packet.setPacketSize(final.getData().size()); + packet.setReturnPacket(PACKET_SEND); +} diff --git a/src/networking/packet/clientbound/cookieRequest.cpp b/src/networking/packet/clientbound/cookieRequest.cpp new file mode 100644 index 0000000..3118504 --- /dev/null +++ b/src/networking/packet/clientbound/cookieRequest.cpp @@ -0,0 +1,93 @@ +#include "logger.hpp" +#include "network/buffer.hpp" +#include "network/networking.hpp" +#include "network/packet.hpp" +#include "network/server.hpp" +#include "player.hpp" + +#include + +void handleCookieRequest(Packet& packet, Server& server) { + // g_logger->logNetwork(INFO, "Received Cookie Request in Configuration state", + // "Configuration"); + + Player* player = packet.getPlayer(); + if (!player) { + // g_logger->logNetwork(ERROR, "Error: No player associated with Cookie Request packet", + // "Configuration"); + packet.setReturnPacket(PACKET_DISCONNECT); + return; + } + + // Debug: Log raw packet data + // g_logger->logNetwork(INFO, "Cookie Request packet size: " + std::to_string(packet.getSize()) + // + " bytes", "Configuration"); + + // Read the cookie identifier from the request + std::string cookieIdentifier; + try { + // Create a fresh buffer from the packet data to read from beginning + Buffer cookieBuffer(packet.getData().getData()); + cookieIdentifier = cookieBuffer.readString(32767); // Max string length + // g_logger->logNetwork(INFO, "Cookie Request for identifier: '" + cookieIdentifier + "'", + // "Configuration"); + } catch (const std::exception& e) { + // g_logger->logNetwork(ERROR, "Failed to read cookie identifier: " + std::string(e.what()), + // "Configuration"); Send empty response instead of disconnecting + cookieIdentifier = "unknown"; + } + + // Create Cookie Response packet (0x01) + Buffer payload; + payload.writeVarInt(0x01); // Cookie Response packet ID + payload.writeString(cookieIdentifier); // Echo back the identifier + + // For now, send empty cookie data (no stored cookie) + payload.writeByte(0x00); // Has payload: false (no cookie data) + + Buffer final; + final.writeVarInt(payload.getData().size()); + final.writeBytes(payload.getData()); + + packet.getData() = final; + packet.setReturnPacket(PACKET_SEND); + packet.setPacketSize(final.getData().size()); + + // g_logger->logNetwork(INFO, "Sent Cookie Response for identifier: '" + cookieIdentifier + "' + // (no data), response size: " + std::to_string(final.getData().size()), "Configuration"); + + // g_logger->logNetwork(INFO, "Cookie Response sent - now sending Finish Configuration to + // advance sequence", "Configuration"); + + (void)server; // Suppress unused parameter warning +} + +void sendFinishConfigurationAfterCookie(Packet& packet, Server& server) { + // g_logger->logNetwork(INFO, "Sending Finish Configuration to advance sequence", + // "Configuration"); + + Player* player = packet.getPlayer(); + if (!player) { + // g_logger->logNetwork(ERROR, "Error: No player for Finish Configuration", + // "Configuration"); + return; + } + + // Create Finish Configuration packet (0x03) + Buffer payload; + payload.writeVarInt(0x03); // Finish Configuration packet ID + + Buffer final; + final.writeVarInt(payload.getData().size()); + final.writeBytes(payload.getData()); + + // Create a new packet for Finish Configuration + Packet* finishPacket = new Packet(packet); + finishPacket->getData() = final; + finishPacket->setReturnPacket(PACKET_SEND); + finishPacket->setPacketSize(final.getData().size()); + + // g_logger->logNetwork(INFO, "Finish Configuration packet prepared", "Configuration"); + + (void)server; +} diff --git a/src/networking/packet/clientbound/gameEvent.cpp b/src/networking/packet/clientbound/gameEvent.cpp new file mode 100644 index 0000000..706d860 --- /dev/null +++ b/src/networking/packet/clientbound/gameEvent.cpp @@ -0,0 +1,28 @@ +#include "network/buffer.hpp" +#include "network/packet.hpp" +#include "player.hpp" + +#include + +void gameEventPacket(Packet& packet, Server& server) { + Player* player = packet.getPlayer(); + if (!player) return; + + Buffer buf; + + buf.writeByte(0x22); + buf.writeByte(13); + buf.writeFloat(0); + + + Buffer final; + + final.writeVarInt(buf.getData().size()); + final.writeBytes(buf.getData()); + + packet.setPacketId(0x22); + packet.getData() = final; + packet.setPacketSize(final.getData().size()); + packet.setReturnPacket(PACKET_SEND); + (void)server; +} diff --git a/src/networking/packet/clientbound/levelChunkWithLight.cpp b/src/networking/packet/clientbound/levelChunkWithLight.cpp new file mode 100644 index 0000000..c855495 --- /dev/null +++ b/src/networking/packet/clientbound/levelChunkWithLight.cpp @@ -0,0 +1,103 @@ +#include "network/buffer.hpp" +#include "network/packet.hpp" +#include "player.hpp" + +void levelChunkWithLight(Packet& packet, Server& server) { + int chunkX = 0; + int chunkZ = 0; + + std::cout << "=== Sending Chunk Data (" << chunkX << ", " << chunkZ << ") ===\n"; + + Buffer buf; + + try { + // Use your new chunk loading system + World::Query query = server.getWorldQuery(); + World::ChunkData chunkData = query.fetchChunk(chunkX, chunkZ); + + // Write chunk coordinates + buf.writeInt(chunkX); + buf.writeInt(chunkZ); + + // Write heightmaps (proper NBT format) + if (!chunkData.heightmaps.empty()) { + buf.writeBytes(chunkData.heightmaps); + } else { + // Empty heightmap NBT compound + buf.writeByte(0x0A); // TAG_Compound + buf.writeVarInt(0); // Empty name length + buf.writeByte(0x00); // TAG_End + } + + // Write chunk data + if (!chunkData.blockData.empty()) { + buf.writeVarInt(chunkData.blockData.size()); + buf.writeBytes(chunkData.blockData); + } else { + // Generate simple empty chunk inline + Buffer emptyData; + const int NUM_SECTIONS = 24; + + for (int section = 0; section < NUM_SECTIONS; section++) { + // Block count (Short - number of non-air blocks) + emptyData.writeUShort(0); // All air blocks + + // Block states palette + emptyData.writeByte(0); // Bits per entry (single value) + emptyData.writeVarInt(0); // Air block state ID (should be 0) + emptyData.writeVarInt(0); // Data array length (no data needed for single value) + + // Biomes palette + emptyData.writeByte(0); // Bits per entry (single value) + emptyData.writeVarInt(0); // Safest biome ID (should always exist) + emptyData.writeVarInt(0); // Data array length (no data needed for single value) + } + + buf.writeVarInt(emptyData.getData().size()); + buf.writeBytes(emptyData.getData()); + } + + // Block entities + buf.writeVarInt(0); + + // Light data (proper format) + // Sky Light Mask + buf.writeVarInt(1); // Sky light mask array length + buf.writeLong(0x1FFFFFF); // Mask for sections 0-24 (all have sky light) + + // Block Light Mask + buf.writeVarInt(1); // Block light mask array length + buf.writeLong(0); // No block light sections + + // Empty Sky Light Mask + buf.writeVarInt(1); // Empty sky light mask array length + buf.writeLong(0); // No empty sky light sections + + // Empty Block Light Mask + buf.writeVarInt(1); // Empty block light mask array length + buf.writeLong(0); // No empty block light sections + + // Sky light data arrays (25 sections: -4 to 20) + for (int i = 0; i < 25; i++) { + buf.writeVarInt(2048); // Light array size (16x16x16 / 2) + for (int j = 0; j < 2048; j++) { + buf.writeByte(0xFF); // Full sky light (15 << 4 | 15) + } + } + + // No block light arrays since mask is 0 + + } catch (const std::exception& e) { + std::cerr << "Error in sendChunkData: " << e.what() << std::endl; + // Return without setting packet data - this will cause the packet to be skipped + return; + } + + // Set packet data (no manual length encoding) + packet.setPacketId(0x27); // Level Chunk with Light packet ID + packet.getData() = buf; + packet.setPacketSize(buf.getData().size()); + packet.setReturnPacket(PACKET_SEND); + + (void)server; +} diff --git a/src/networking/packet/loginStart.cpp b/src/networking/packet/clientbound/loginStart.cpp similarity index 70% rename from src/networking/packet/loginStart.cpp rename to src/networking/packet/clientbound/loginStart.cpp index 0febb03..721af5d 100644 --- a/src/networking/packet/loginStart.cpp +++ b/src/networking/packet/clientbound/loginStart.cpp @@ -1,12 +1,11 @@ -#include "UUID.hpp" -#include "buffer.hpp" -#include "networking.hpp" -#include "packet.hpp" -#include "player.hpp" -#include "server.hpp" +#include "lib/UUID.hpp" #include "logger.hpp" +#include "network/buffer.hpp" +#include "network/networking.hpp" +#include "network/packet.hpp" +#include "network/server.hpp" +#include "player.hpp" -#include #include void handleLoginStartPacket(Packet& packet, Server& server) { @@ -25,7 +24,7 @@ void handleLoginStartPacket(Packet& packet, Server& server) { payload.writeUUID(uuid); payload.writeString(username); payload.writeVarInt(0); // properties length (no properties) - + // Debug: Log the raw payload bytes std::string payloadHex = ""; for (size_t i = 0; i < payload.getData().size(); i++) { @@ -37,20 +36,20 @@ void handleLoginStartPacket(Packet& packet, Server& server) { g_logger->logNetwork(INFO, "Login Success payload bytes: " + payloadHex, "Login"); // Calculate total packet size (packet ID + payload) - int packetId = 0x02; - int payloadSize = payload.getData().size(); + int packetId = 0x02; + int payloadSize = payload.getData().size(); int packetIdVarintSize = packet.getVarintSize(packetId); - int totalPayloadSize = packetIdVarintSize + payloadSize; + int totalPayloadSize = packetIdVarintSize + payloadSize; Buffer final; - final.writeVarInt(totalPayloadSize); // Total packet size - final.writeVarInt(packetId); // Login Success packet ID (0x02) - final.writeBytes(payload.getData()); // UUID + username + properties + final.writeVarInt(totalPayloadSize); // Total packet size + final.writeVarInt(packetId); // Login Success packet ID (0x02) + final.writeBytes(payload.getData()); // UUID + username + properties packet.getData() = final; packet.setReturnPacket(PACKET_SEND); packet.setPacketSize(final.getData().size()); - + // Debug: Log the complete packet bytes std::string finalHex = ""; for (size_t i = 0; i < final.getData().size(); i++) { @@ -60,8 +59,11 @@ void handleLoginStartPacket(Packet& packet, Server& server) { if (i < final.getData().size() - 1) finalHex += " "; } g_logger->logNetwork(INFO, "Complete Login Success packet bytes: " + finalHex, "Login"); - + // Don't transition to Configuration yet - wait for Login Acknowledged - g_logger->logNetwork(INFO, "Login Success sent for user: " + username + ", UUID: " + uuid.toString() + ", packet size: " + std::to_string(final.getData().size()), "Login"); + g_logger->logNetwork(INFO, + "Login Success sent for user: " + username + ", UUID: " + uuid.toString() + + ", packet size: " + std::to_string(final.getData().size()), + "Login"); (void)server; } diff --git a/src/networking/packet/ping.cpp b/src/networking/packet/clientbound/ping.cpp similarity index 76% rename from src/networking/packet/ping.cpp rename to src/networking/packet/clientbound/ping.cpp index eaf7a40..89a9c86 100644 --- a/src/networking/packet/ping.cpp +++ b/src/networking/packet/clientbound/ping.cpp @@ -1,9 +1,8 @@ -#include "buffer.hpp" -#include "networking.hpp" -#include "packet.hpp" +#include "network/buffer.hpp" +#include "network/networking.hpp" +#include "network/packet.hpp" +#include "network/server.hpp" #include "player.hpp" -#include "server.hpp" -#include "logger.hpp" #include @@ -16,9 +15,10 @@ void handlePingPacket(Packet& packet, Server& server) { long timestamp = packet.getData().readLong(); - // g_logger->logNetwork(INFO, "Received ping request with timestamp: " + std::to_string(timestamp), "Ping"); + // g_logger->logNetwork(INFO, "Received ping request with timestamp: " + + // std::to_string(timestamp), "Ping"); - int packetId = 0x01; + int packetId = 0x01; int packetIdVarintSize = packet.getVarintSize(packetId); int totalPayloadSize = packetIdVarintSize + 8; @@ -32,7 +32,8 @@ void handlePingPacket(Packet& packet, Server& server) { packet.setPacketSize(buf.getData().size()); packet.getPlayer()->setPlayerState(PlayerState::None); - // g_logger->logNetwork(INFO, "Pong response ready - echoing timestamp " + std::to_string(timestamp), "Ping"); + // g_logger->logNetwork(INFO, "Pong response ready - echoing timestamp " + + // std::to_string(timestamp), "Ping"); (void)server; } diff --git a/src/networking/packet/clientbound/play.cpp b/src/networking/packet/clientbound/play.cpp new file mode 100644 index 0000000..b00ca0d --- /dev/null +++ b/src/networking/packet/clientbound/play.cpp @@ -0,0 +1,96 @@ +#include "network/buffer.hpp" +#include "network/packet.hpp" +#include "player.hpp" + +#include + +void writePlayPacket(Packet& packet, Server& server) { + Player* player = packet.getPlayer(); + if (!player) return; + + Buffer buf; + + buf.writeByte(0x2B); + + // 1. Entity ID + buf.writeInt(player->getPlayerID()); + + // 2. Is hardcore + buf.writeBool(false); + + // 3. Dimension Names (Prefixed Array of Identifier) + buf.writeVarInt(3); // Number of dimensions + buf.writeString("minecraft:overworld"); + buf.writeString("minecraft:the_nether"); + buf.writeString("minecraft:the_end"); + + // 4. Max Players + buf.writeVarInt(20); + + // 5. View Distance + buf.writeVarInt(10); + + // 6. Simulation Distance + buf.writeVarInt(10); + + // 7. Reduced Debug Info + buf.writeBool(false); + + // 8. Enable respawn screen + buf.writeBool(true); + + // 9. Do limited crafting + buf.writeBool(false); + + // 10. Dimension Type (VarInt - registry ID) + buf.writeVarInt(0); // overworld dimension type ID + + // 11. Dimension Name (Identifier) + buf.writeString("minecraft:overworld"); + + // 12. Hashed seed + buf.writeLong(1L); + + // 13. Game mode (Unsigned Byte) + buf.writeByte(0); // Creative + + // 14. Previous Game mode (Byte) + buf.writeByte(-1); // Undefined + + // 15. Is Debug + buf.writeBool(false); + + // 16. Is Flat + buf.writeBool(true); + + // 17. Has death location + bool hasDeathLocation = false; // Set to true if player has died + buf.writeBool(hasDeathLocation); + + // 18. Death dimension name (Optional - only if hasDeathLocation is true) + // 19. Death location (Optional - only if hasDeathLocation is true) + if (hasDeathLocation) { + buf.writeString("minecraft:overworld"); // Death dimension name + buf.writeLong(0); // Death location as Position (packed long) + } + + // 20. Portal cooldown + buf.writeVarInt(0); + + // 21. Sea level + buf.writeVarInt(63); + + // 22. Enforces Secure Chat + buf.writeBool(false); + + Buffer final; + + final.writeVarInt(buf.getData().size()); + final.writeBytes(buf.getData()); + + packet.setPacketId(0x2B); + packet.getData() = final; + packet.setPacketSize(final.getData().size()); + packet.setReturnPacket(PACKET_SEND); + (void)server; +} diff --git a/src/networking/packet/clientbound/playerAbilities.cpp b/src/networking/packet/clientbound/playerAbilities.cpp new file mode 100644 index 0000000..802751e --- /dev/null +++ b/src/networking/packet/clientbound/playerAbilities.cpp @@ -0,0 +1,19 @@ +#include "buffer.hpp" +#include "packet.hpp" + +void playerAbilities(Packet& packet) { + Buffer buff; + + buff.writeByte(0x39); + buff.writeByte(0x08); // Invulnerable 0x01; Flying 0x02; Allow Flying 0x04; Creative Mode 0x08; + buff.writeFloat(0.05); // Flight speed + buff.writeFloat(1); // Fov modifier + + Buffer final; + final.writeVarInt(buff.getData().size()); + final.writeBytes(buff.getData()); + + packet.getData() = final; + packet.setPacketSize(final.getData().size()); + packet.setReturnPacket(PACKET_SEND); +} diff --git a/src/networking/packet/clientbound/setHeldItem.cpp b/src/networking/packet/clientbound/setHeldItem.cpp new file mode 100644 index 0000000..b345a97 --- /dev/null +++ b/src/networking/packet/clientbound/setHeldItem.cpp @@ -0,0 +1,17 @@ +#include "buffer.hpp" +#include "packet.hpp" + +void setHeldItem(Packet& packet) { + Buffer buff; + + buff.writeByte(0x62); + buff.writeVarInt(3); // 0-8 hand slots --> Should get it from player data when implemented + + Buffer final; + final.writeVarInt(buff.getData().size()); + final.writeBytes(buff.getData()); + + packet.getData() = final; + packet.setPacketSize(final.getData().size()); + packet.setReturnPacket(PACKET_SEND); +} diff --git a/src/networking/packet/status.cpp b/src/networking/packet/clientbound/status.cpp similarity index 60% rename from src/networking/packet/status.cpp rename to src/networking/packet/clientbound/status.cpp index 45bc47d..7536ff3 100644 --- a/src/networking/packet/status.cpp +++ b/src/networking/packet/clientbound/status.cpp @@ -1,10 +1,9 @@ -#include "buffer.hpp" -#include "json.hpp" -#include "networking.hpp" -#include "packet.hpp" +#include "lib/json.hpp" +#include "network/buffer.hpp" +#include "network/networking.hpp" +#include "network/packet.hpp" +#include "network/server.hpp" #include "player.hpp" -#include "server.hpp" -#include "logger.hpp" #include #include @@ -18,16 +17,13 @@ void handleStatusPacket(Packet& packet, Server& server) { return; } - json jres = {{"version", - {{"name", server.getGameVersion()}, {"protocol", server.getProtocolVersion()}}}, - {"players", - {{"max", server.getServerSize()}, - {"online", server.getAmountOnline()}, - {"sample", server.getPlayerSample()}}}, - {"description", {{"text", server.getServerMOTD()}}}}; + json jres = { + {"version", {{"name", server.getConfig().getVersion()}, {"protocol", server.getConfig().getProtocolVersion()}}}, + {"players", {{"max", server.getConfig().getServerSize()}, {"online", server.getAmountOnline()}, {"sample", server.getPlayerSample()}}}, + {"description", {{"text", server.getConfig().getServerMotd()}}}}; std::string payload = jres.dump(); - int jsonLen = payload.size(); + int jsonLen = payload.size(); int packetId = 0x00; int packetIdVarintSize = packet.getVarintSize(packetId); diff --git a/src/networking/packet/cookieRequest.cpp b/src/networking/packet/cookieRequest.cpp deleted file mode 100644 index 5cd75df..0000000 --- a/src/networking/packet/cookieRequest.cpp +++ /dev/null @@ -1,84 +0,0 @@ -#include "networking.hpp" -#include "packet.hpp" -#include "player.hpp" -#include "server.hpp" -#include "logger.hpp" -#include "buffer.hpp" -#include - -void handleCookieRequest(Packet& packet, Server& server) { - // g_logger->logNetwork(INFO, "Received Cookie Request in Configuration state", "Configuration"); - - Player* player = packet.getPlayer(); - if (!player) { - // g_logger->logNetwork(ERROR, "Error: No player associated with Cookie Request packet", "Configuration"); - packet.setReturnPacket(PACKET_DISCONNECT); - return; - } - - // Debug: Log raw packet data - // g_logger->logNetwork(INFO, "Cookie Request packet size: " + std::to_string(packet.getSize()) + " bytes", "Configuration"); - - // Read the cookie identifier from the request - std::string cookieIdentifier; - try { - // Create a fresh buffer from the packet data to read from beginning - Buffer cookieBuffer(packet.getData().getData()); - cookieIdentifier = cookieBuffer.readString(32767); // Max string length - // g_logger->logNetwork(INFO, "Cookie Request for identifier: '" + cookieIdentifier + "'", "Configuration"); - } catch (const std::exception& e) { - // g_logger->logNetwork(ERROR, "Failed to read cookie identifier: " + std::string(e.what()), "Configuration"); - // Send empty response instead of disconnecting - cookieIdentifier = "unknown"; - } - - // Create Cookie Response packet (0x01) - Buffer payload; - payload.writeVarInt(0x01); // Cookie Response packet ID - payload.writeString(cookieIdentifier); // Echo back the identifier - - // For now, send empty cookie data (no stored cookie) - payload.writeByte(0x00); // Has payload: false (no cookie data) - - Buffer final; - final.writeVarInt(payload.getData().size()); - final.writeBytes(payload.getData()); - - packet.getData() = final; - packet.setReturnPacket(PACKET_SEND); - packet.setPacketSize(final.getData().size()); - - // g_logger->logNetwork(INFO, "Sent Cookie Response for identifier: '" + cookieIdentifier + "' (no data), response size: " + std::to_string(final.getData().size()), "Configuration"); - - // g_logger->logNetwork(INFO, "Cookie Response sent - now sending Finish Configuration to advance sequence", "Configuration"); - - (void)server; // Suppress unused parameter warning -} - -void sendFinishConfigurationAfterCookie(Packet& packet, Server& server) { - // g_logger->logNetwork(INFO, "Sending Finish Configuration to advance sequence", "Configuration"); - - Player* player = packet.getPlayer(); - if (!player) { - // g_logger->logNetwork(ERROR, "Error: No player for Finish Configuration", "Configuration"); - return; - } - - // Create Finish Configuration packet (0x03) - Buffer payload; - payload.writeVarInt(0x03); // Finish Configuration packet ID - - Buffer final; - final.writeVarInt(payload.getData().size()); - final.writeBytes(payload.getData()); - - // Create a new packet for Finish Configuration - Packet* finishPacket = new Packet(packet); - finishPacket->getData() = final; - finishPacket->setReturnPacket(PACKET_SEND); - finishPacket->setPacketSize(final.getData().size()); - - // g_logger->logNetwork(INFO, "Finish Configuration packet prepared", "Configuration"); - - (void)server; -} diff --git a/src/networking/packet/finishConfiguration.cpp b/src/networking/packet/finishConfiguration.cpp deleted file mode 100644 index e75801b..0000000 --- a/src/networking/packet/finishConfiguration.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "networking.hpp" -#include "packet.hpp" -#include "player.hpp" -#include "server.hpp" -#include "logger.hpp" -#include - -void handleFinishConfiguration(Packet& packet, Server& server) { - // g_logger->logNetwork(INFO, "Starting configuration finish sequence", "Configuration"); - - Player* player = packet.getPlayer(); - if (!player) { - // g_logger->logNetwork(ERROR, "Error: No player associated with packet", "Configuration"); - packet.setReturnPacket(PACKET_DISCONNECT); - return; - } - - // g_logger->logNetwork(INFO, "Sending Finish Configuration packet to " + player->getPlayerName(), "Configuration"); - - // Send Finish Configuration packet (0x03) - Buffer payload; - payload.writeVarInt(0x03); // Finish Configuration packet ID - - Buffer final; - final.writeVarInt(payload.getData().size()); - final.writeBytes(payload.getData()); - - packet.getData() = final; - packet.setReturnPacket(PACKET_SEND); - packet.setPacketSize(final.getData().size()); - - // g_logger->logNetwork(INFO, "Finish Configuration packet sent, waiting for client acknowledgment", "Configuration"); - - (void)server; // Suppress unused parameter warning -} - -void handleAcknowledgeFinishConfiguration(Packet& packet, Server& server) { - // g_logger->logNetwork(INFO, "Received Acknowledge Finish Configuration", "Configuration"); - - Player* player = packet.getPlayer(); - if (!player) { - // g_logger->logNetwork(ERROR, "Error: No player associated with packet", "Configuration"); - packet.setReturnPacket(PACKET_DISCONNECT); - return; - } - - // Client has acknowledged finish configuration, now transition to Play state - player->setPlayerState(PlayerState::Play); - - // g_logger->logNetwork(INFO, "Player " + player->getPlayerName() + " transitioned to Play state - ready for game packets", "Configuration"); - - // Just acknowledge the packet - the actual game sequence will be triggered separately - packet.setReturnPacket(PACKET_OK); - - (void)server; // Suppress unused parameter warning -} diff --git a/src/networking/packet/handleClientInformation.cpp b/src/networking/packet/handleClientInformation.cpp deleted file mode 100644 index 1a84fdc..0000000 --- a/src/networking/packet/handleClientInformation.cpp +++ /dev/null @@ -1,41 +0,0 @@ -#include "logger.hpp" -#include "packet.hpp" -#include "server.hpp" - -#include - -void handleClientInformation(Packet& packet, Server& server) { - PlayerConfig* config = packet.getPlayer()->getPlayerConfig(); - - config->setLocale(packet.getData().readString(16)); - config->setViewDistance(packet.getData().readByte()); - config->setChatMode(packet.getData().readVarInt()); - config->setChatColors(packet.getData().readByte() != 0); - config->setDisplayedSkinParts(packet.getData().readByte()); - config->setMainHand(packet.getData().readVarInt()); - config->setTextFiltering(packet.getData().readByte() != 0); - config->setServerListings(packet.getData().readByte() != 0); - - // g_logger->logGameInfo(INFO, "Received client settings:", "ClientInfo"); - // g_logger->logGameInfo(INFO, "Local: " + config->getLocale(), "ClientInfo"); - // g_logger->logGameInfo( - // INFO, "View Distance: " + std::to_string(config->getViewDistance()), "ClientInfo"); - // g_logger->logGameInfo( - // INFO, "Chat Mode: " + std::to_string(config->getChatMode()), "ClientInfo"); - // g_logger->logGameInfo( - // INFO, "Chat Colors: " + std::to_string(config->getChatColors()), "ClientInfo"); - // g_logger->logGameInfo(INFO, - // "Displayed Skin Parts: " + - // std::to_string(config->getDisplayedSkinParts()), - // "ClientInfo"); - // g_logger->logGameInfo( - // INFO, "Main Hand: " + std::to_string(config->getMainHand()), "ClientInfo"); - // g_logger->logGameInfo(INFO, - // "Enabled Text Filtering: " + std::to_string(config->getTextFiltering()), - // "ClientInfo"); - // g_logger->logGameInfo(INFO, - // "Allow Server Listings: " + std::to_string(config->getServerListings()), - // "ClientInfo"); - packet.setReturnPacket(PACKET_OK); - (void)server; -} diff --git a/src/networking/packet/loginAcknowledged.cpp b/src/networking/packet/loginAcknowledged.cpp deleted file mode 100644 index d75a8f5..0000000 --- a/src/networking/packet/loginAcknowledged.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include "networking.hpp" -#include "packet.hpp" -#include "player.hpp" -#include "server.hpp" -#include "logger.hpp" -#include - -void handleLoginAcknowledged(Packet& packet, Server& server) { - // g_logger->logNetwork(INFO, "Login Acknowledged received - transitioning to Configuration state", "Login"); - - Player* player = packet.getPlayer(); - if (!player) { - // g_logger->logNetwork(ERROR, "Error: No player associated with Login Acknowledged packet", "Login"); - packet.setReturnPacket(PACKET_DISCONNECT); - return; - } - - // The Login Acknowledged packet has no payload (0 bytes), so nothing to read - - // The client has acknowledged the login success, now we officially transition to Configuration state - player->setPlayerState(PlayerState::Configuration); - - // g_logger->logNetwork(INFO, "Player " + player->getPlayerName() + " successfully acknowledged login - transitioned to Configuration state", "Login"); - - // Just acknowledge the packet - don't send anything yet - // The client will send Client Information (packet 0x03) next in Configuration state - packet.setReturnPacket(PACKET_OK); - - (void)server; // Suppress unused parameter warning -} diff --git a/src/networking/packet/packetRouter.cpp b/src/networking/packet/packetRouter.cpp deleted file mode 100644 index 39961cc..0000000 --- a/src/networking/packet/packetRouter.cpp +++ /dev/null @@ -1,340 +0,0 @@ -#include "logger.hpp" -#include "networking.hpp" -#include "packet.hpp" -#include "player.hpp" -#include "server.hpp" - -#include - -// Forward declarations of state handlers -void handleHandshakeState(Packet* packet, - Server& server, - ThreadSafeQueue* outgoingPackets); -void handleStatusState(Packet* packet, Server& server, ThreadSafeQueue* outgoingPackets); -void handleLoginState(Packet* packet, Server& server, ThreadSafeQueue* outgoingPackets); -void handleConfigurationState(Packet* packet, - Server& server, - ThreadSafeQueue* outgoingPackets); -void handlePlayState(Packet* packet, Server& server, ThreadSafeQueue* outgoingPackets); -void sendDisconnectPacket(Packet* packet, - const std::string& reason, - ThreadSafeQueue* outgoingPackets); -void initGameSequence(Packet* packet, ThreadSafeQueue* _outgoingPackets, Server& server); - -// ======================================== -// Main Packet Router -// ======================================== - -void packetRouter(Packet* packet, Server& server, ThreadSafeQueue* _outgoingPackets) { - if (packet == nullptr) return; - if (_outgoingPackets == nullptr) return; - - Player* player = packet->getPlayer(); - - if (player == nullptr) { - packet->setReturnPacket(PACKET_DISCONNECT); - return; - } - - g_logger->logNetwork(INFO, - "Routing packet ID: 0x" + std::to_string(packet->getId()) + - " (size: " + std::to_string(packet->getSize()) + ") for state: " + - std::to_string(static_cast(player->getPlayerState())), - "PacketRouter"); - - switch (player->getPlayerState()) { - case PlayerState::Handshake: - handleHandshakeState(packet, server, _outgoingPackets); - break; - case PlayerState::Status: - handleStatusState(packet, server, _outgoingPackets); - break; - case PlayerState::Login: - handleLoginState(packet, server, _outgoingPackets); - break; - case PlayerState::Configuration: - handleConfigurationState(packet, server, _outgoingPackets); - break; - case PlayerState::Play: - handlePlayState(packet, server, _outgoingPackets); - break; - default: - g_logger->logNetwork(WARN, - "Unknown player state: " + - std::to_string(static_cast(player->getPlayerState())) + - ", disconnecting", - "PacketRouter"); - packet->setReturnPacket(PACKET_DISCONNECT); - break; - } -} - -// ======================================== -// Handshake State Handler -// ======================================== - -void handleHandshakeState(Packet* packet, - Server& server, - ThreadSafeQueue* outgoingPackets) { - handleHandshakePacket(*packet, server); -} - -// ======================================== -// Status State Handler -// ======================================== - -void handleStatusState(Packet* packet, Server& server, ThreadSafeQueue* outgoingPackets) { - if (packet->getId() == 0x00) { - handleStatusPacket(*packet, server); - } else if (packet->getId() == 0x01) { - handlePingPacket(*packet, server); - } else { - g_logger->logNetwork(WARN, - "Unknown packet ID in Status state: 0x" + - std::to_string(packet->getId()), - "PacketRouter"); - packet->getPlayer()->setPlayerState(PlayerState::None); - packet->setReturnPacket(PACKET_DISCONNECT); - } -} - -// ======================================== -// Login State Handler -// ======================================== - -void handleLoginState(Packet* packet, Server& server, ThreadSafeQueue* outgoingPackets) { - // Add safety check for packet data integrity - if (packet->getSize() > 32767) { // Max packet size - g_logger->logNetwork(ERROR, - "Packet size too large: " + std::to_string(packet->getSize()), - "PacketRouter"); - packet->setReturnPacket(PACKET_DISCONNECT); - return; - } - - if (packet->getId() == 0x00) { - // Login Start - g_logger->logNetwork(INFO, "Processing Login Start (0x00)", "PacketRouter"); - handleLoginStartPacket(*packet, server); - } else if (packet->getId() == 0x02) { - // Login Plugin Response - safe to ignore most of the time - g_logger->logNetwork( - INFO, "Received Login Plugin Response (0x02) - acknowledging", "PacketRouter"); - packet->setReturnPacket(PACKET_OK); - } else if (packet->getId() == 0x03) { - // Login Acknowledged - g_logger->logNetwork(INFO, "Processing Login Acknowledged (0x03)", "PacketRouter"); - handleLoginAcknowledged(*packet, server); - } else if (packet->getId() == 0x04) { - // Cookie Response (login) - g_logger->logNetwork( - INFO, "Received Login Cookie Response (0x04) - acknowledging", "PacketRouter"); - packet->setReturnPacket(PACKET_OK); - } else { - g_logger->logNetwork(WARN, - "Unknown packet ID in Login state: 0x" + - std::to_string(packet->getId()), - "PacketRouter"); - packet->getPlayer()->setPlayerState(PlayerState::None); - packet->setReturnPacket(PACKET_DISCONNECT); - } -} - -// ======================================== -// Configuration State Handler -// ======================================== - -void handleConfigurationState(Packet* packet, - Server& server, - ThreadSafeQueue* outgoingPackets) { - if (packet->getId() == 0x00) { - // Client Information (configuration) - // g_logger->logNetwork(INFO, "Received Client Information in Configuration state", - // "Configuration"); - handleClientInformation(*packet, server); - packet->setReturnPacket(PACKET_OK); - - // After processing client info, tell client we're done configuring - Packet* finishPacket = new Packet(*packet); - handleFinishConfiguration(*finishPacket, server); - outgoingPackets->push(finishPacket); - // g_logger->logNetwork(INFO, "Sent Finish Configuration after Client Information", - // "Configuration"); - - } else if (packet->getId() == 0x01) { - // Cookie Response (configuration) - // g_logger->logNetwork(INFO, "Received Cookie Response in Configuration state", - // "Configuration"); - packet->setReturnPacket(PACKET_OK); - - } else if (packet->getId() == 0x02) { - // Serverbound Plugin Message (configuration) - g_logger->logNetwork(INFO, - "Received Serverbound Plugin Message (0x02), size: " + - std::to_string(packet->getSize()) + " bytes", - "PacketRouter"); - packet->setReturnPacket(PACKET_OK); - - } else if (packet->getId() == 0x03) { - // Acknowledge Finish Configuration -> enter Play - g_logger->logNetwork( - INFO, - "Received Acknowledge Finish Configuration - transitioning to Play state", - "PacketRouter"); - handleAcknowledgeFinishConfiguration(*packet, server); - initGameSequence(packet, outgoingPackets, server); - - } else if (packet->getId() == 0x04) { - // Keep Alive (configuration) - // g_logger->logNetwork(INFO, "Received Keep Alive in Configuration state", - // "Configuration"); - packet->setReturnPacket(PACKET_OK); - - } else if (packet->getId() == 0x05) { - // Pong (configuration) - // g_logger->logNetwork(INFO, "Received Pong in Configuration state", "Configuration"); - packet->setReturnPacket(PACKET_OK); - - } else if (packet->getId() == 0x06) { - // Resource Pack Response (configuration) - // g_logger->logNetwork(INFO, "Received Resource Pack Response in Configuration state", - // "Configuration"); - packet->setReturnPacket(PACKET_OK); - - } else if (packet->getId() == 0x07) { - // Serverbound Known Packs (configuration) - // g_logger->logNetwork(INFO, "Received Serverbound Known Packs in Configuration state", - // "Configuration"); - packet->setReturnPacket(PACKET_OK); - - } else if (packet->getId() == 0x08) { - // Custom Click Action (configuration) - // g_logger->logNetwork(INFO, "Received Custom Click Action in Configuration state", - // "Configuration"); - packet->setReturnPacket(PACKET_OK); - - } else { - g_logger->logNetwork(WARN, - "Unknown packet ID in Configuration state: 0x" + - std::to_string(packet->getId()), - "PacketRouter"); - sendDisconnectPacket(packet, "Unknown packet in Configuration state", outgoingPackets); - packet->getPlayer()->setPlayerState(PlayerState::None); - packet->setReturnPacket(PACKET_DISCONNECT); - } -} - -// ======================================== -// Play State Handler -// ======================================== - -void handlePlayState(Packet* packet, Server& server, ThreadSafeQueue* outgoingPackets) { - if (packet->getId() == 0x00) { - // Confirm Teleportation - handleConfirmTeleportation(*packet, server); - } else if (packet->getId() == 0x1B) { - // Keep Alive - packet->setReturnPacket(PACKET_OK); - } else { - // Other play packets - // g_logger->logNetwork(INFO, "Received packet ID: " + std::to_string(packet->getId()) + " - // in Play state", "Play"); - packet->setReturnPacket(PACKET_OK); - } -} - -// ======================================== -// Disconnect Packet Creation -// ======================================== - -void sendDisconnectPacket(Packet* packet, - const std::string& reason, - ThreadSafeQueue* outgoingPackets) { - if (!packet || !outgoingPackets) return; - - Player* player = packet->getPlayer(); - if (!player) return; - - g_logger->logNetwork( - INFO, "Sending disconnect packet to player with reason: " + reason, "PacketRouter"); - - try { - // Create Disconnect packet (0x02 in Configuration state) - Buffer payload; - payload.writeVarInt(0x02); // Disconnect packet ID - - // Create JSON reason - std::string jsonReason = "{\"text\":\"" + reason + "\"}"; - payload.writeString(jsonReason); - - Buffer final; - final.writeVarInt(payload.getData().size()); - final.writeBytes(payload.getData()); - - // Create new packet for disconnect - Packet* disconnectPacket = new Packet(*packet); - disconnectPacket->getData() = final; - disconnectPacket->setReturnPacket(PACKET_SEND); - disconnectPacket->setPacketSize(final.getData().size()); - - outgoingPackets->push(disconnectPacket); - - g_logger->logNetwork(INFO, "Disconnect packet queued for sending", "PacketRouter"); - } catch (const std::exception& e) { - g_logger->logNetwork(ERROR, - "Error creating disconnect packet: " + std::string(e.what()), - "PacketRouter"); - } -} - -// ======================================== -// Game Initialization Sequence -// ======================================== - -void initGameSequence(Packet* packet, ThreadSafeQueue* _outgoingPackets, Server& server) { - if (packet == nullptr || _outgoingPackets == nullptr) return; - - Player* player = packet->getPlayer(); - if (player == nullptr) return; - - // Player should already be in Play state at this point - g_logger->logNetwork( - INFO, "Starting game sequence for player: " + player->getPlayerName(), "PacketRouter"); - - try { - // 1. Send Login (play) packet - 0x2B - g_logger->logNetwork(INFO, "Sending Login (play) packet", "PacketRouter"); - Packet* playPacket = new Packet(*packet); - writePlayPacket(*playPacket, server); - _outgoingPackets->push(playPacket); - - // 3. Send complete chunk batch sequence (Start -> Chunks -> Finished) - sendChunkBatchSequence(*packet, server, _outgoingPackets); - - // 2. Send Set Center Chunk - 0x57 - Packet* setCenterPacket = new Packet(*packet); - writeSetCenterPacket(*setCenterPacket, server); - _outgoingPackets->push(setCenterPacket); - - // 4. Send player position and look - 0x41 - Packet* positionPacket = new Packet(*packet); - sendPlayerPositionAndLook(*positionPacket, server); - _outgoingPackets->push(positionPacket); - - // 5. Send spawn position - 0x5A - Packet* spawnPacket = new Packet(*packet); - sendSpawnPosition(*spawnPacket, server); - _outgoingPackets->push(spawnPacket); - - // // 6. Complete spawn sequence (abilities, health, experience, time, held item) - completeSpawnSequence(*packet, server, _outgoingPackets); - - g_logger->logNetwork(INFO, "Complete game sequence sent to player: ", "PacketRouter"); - - packet->setReturnPacket(PACKET_OK); - } catch (const std::exception& e) { - g_logger->logNetwork( - ERROR, "Error in game sequence: " + std::string(e.what()), "PacketRouter"); - packet->setReturnPacket(PACKET_ERROR); - } -} diff --git a/src/networking/packet/play.cpp b/src/networking/packet/play.cpp deleted file mode 100644 index f3fcbf3..0000000 --- a/src/networking/packet/play.cpp +++ /dev/null @@ -1,135 +0,0 @@ -#include "buffer.hpp" -#include "nbt.hpp" -#include "networking.hpp" -#include "packet.hpp" -#include "server.hpp" - -#include -#include -#include - -void writePlayPacket(Packet& packet, Server& server) { - Player* player = packet.getPlayer(); - if (!player) return; - - Buffer buf; - - // --- 1. Entity ID --- - buf.writeInt(player->getPlayerID()); - - // --- 2. Is Hardcore --- - buf.writeBool(false); - - // --- 3. Game mode --- - buf.writeByte(0); // Survival - - // --- 4. Previous game mode --- - buf.writeByte(-1); - - // --- 5. World names --- - buf.writeVarInt(1); - buf.writeString("minecraft:overworld"); - - // --- 6. Registry codec (NBT) --- - nbt::TagCompound root; - - // Minimal dimension_type - nbt::TagCompound dimensionTypes; - nbt::TagCompound overworldType; - overworldType["piglin_safe"] = true; - overworldType["natural"] = true; - overworldType["ambient_light"] = 0.0f; - overworldType["logical_height"] = 256; - overworldType["infiniburn"] = "minecraft:infiniburn_overworld"; - overworldType["ultrawarm"] = false; - overworldType["coordinate_scale"] = 1.0f; - overworldType["has_skylight"] = true; - overworldType["has_ceiling"] = false; - overworldType["respawn_anchor_works"] = false; - overworldType["bed_works"] = true; - overworldType["effects"] = "minecraft:overworld"; - dimensionTypes["minecraft:overworld"] = std::make_shared(overworldType); - - root["minecraft:dimension_type"] = std::make_shared(dimensionTypes); - - // Minimal biome registry - nbt::TagCompound biomes; - nbt::TagCompound plainsBiome; - plainsBiome["precipitation"] = std::string("rain"); - plainsBiome["depth"] = 0.125f; - plainsBiome["temperature"] = 0.8f; - plainsBiome["scale"] = 0.05f; - plainsBiome["downfall"] = 0.4f; - plainsBiome["category"] = std::string("plains"); - biomes["minecraft:plains"] = std::make_shared(plainsBiome); - - root["minecraft:worldgen/biome"] = std::make_shared(biomes); - - // Minimal noise settings registry - nbt::TagCompound noiseSettings; - nbt::TagCompound overworldNoise; - overworldNoise["sea_level"] = 63; - overworldNoise["height"] = "minecraft:overworld"; - noiseSettings["minecraft:overworld"] = std::make_shared(overworldNoise); - - root["minecraft:worldgen/noise_settings"] = std::make_shared(noiseSettings); - - // Encode NBT into buffer - std::ostringstream nbtStream; - nbt::NBT nbtData("root", root); - nbtData.encode(nbtStream); - std::string nbtBytes = nbtStream.str(); - buf.writeBytes(std::vector(nbtBytes.begin(), nbtBytes.end())); - - // --- 7. Dimension (current) --- - buf.writeString("minecraft:overworld"); - - // --- 8. Hashed seed --- - buf.writeLong(12345678L); - - // --- 9. Max players --- - buf.writeVarInt(20); - - // --- 10. View distance --- - buf.writeVarInt(10); - - // --- 11. Simulation distance --- - buf.writeVarInt(10); - - // --- 12. Reduced debug info --- - buf.writeBool(false); - - // --- 13. Enable respawn screen --- - buf.writeBool(true); - - // --- 14. Do limited crafting --- - buf.writeBool(false); - - // --- 15. Dimension type name --- - buf.writeString("minecraft:overworld"); - - // --- 16. Dimension name --- - buf.writeString("minecraft:overworld"); - - // --- 17. Portal cooldown --- - buf.writeVarInt(0); - - // --- 18. Enforces secure chat --- - buf.writeBool(false); - - // --- Encapsulate packet ID + data --- - int packetId = 0x2B; // Login packet - Buffer payload; - payload.writeVarInt(packetId); - payload.writeBytes(buf.getData()); - - // --- Final buffer with size prefix --- - Buffer finalBuf; - finalBuf.writeVarInt(payload.getData().size()); - finalBuf.writeBytes(payload.getData()); - - packet.getData() = finalBuf; - packet.setPacketSize(finalBuf.getData().size()); - packet.setPacketId(packetId); - packet.setReturnPacket(PACKET_SEND); -} diff --git a/src/networking/packet/serverbound/FinishConfiguration.cpp b/src/networking/packet/serverbound/FinishConfiguration.cpp new file mode 100644 index 0000000..765caa2 --- /dev/null +++ b/src/networking/packet/serverbound/FinishConfiguration.cpp @@ -0,0 +1,24 @@ +#include "network/packet.hpp" +#include "player.hpp" + +void handleAcknowledgeFinishConfiguration(Packet& packet, Server& server) { + // g_logger->logNetwork(INFO, "Received Acknowledge Finish Configuration", "Configuration"); + + Player* player = packet.getPlayer(); + if (!player) { + // g_logger->logNetwork(ERROR, "Error: No player associated with packet", "Configuration"); + packet.setReturnPacket(PACKET_DISCONNECT); + return; + } + + // Client has acknowledged finish configuration, now transition to Play state + player->setPlayerState(PlayerState::Play); + + // g_logger->logNetwork(INFO, "Player " + player->getPlayerName() + " transitioned to Play state + // - ready for game packets", "Configuration"); + + // Just acknowledge the packet - the actual game sequence will be triggered separately + packet.setReturnPacket(PACKET_OK); + + (void)server; // Suppress unused parameter warning +} diff --git a/src/networking/packet/serverbound/handleClientInformation.cpp b/src/networking/packet/serverbound/handleClientInformation.cpp new file mode 100644 index 0000000..edd029c --- /dev/null +++ b/src/networking/packet/serverbound/handleClientInformation.cpp @@ -0,0 +1,18 @@ +#include "network/packet.hpp" +#include "network/server.hpp" +#include "player.hpp" + +void handleClientInformation(Packet& packet, Server& server) { + PlayerConfig* config = packet.getPlayer()->getPlayerConfig(); + + config->setLocale(packet.getData().readString(16)); + config->setViewDistance(packet.getData().readByte()); + config->setChatMode(packet.getData().readVarInt()); + config->setChatColors(packet.getData().readByte() != 0); + config->setDisplayedSkinParts(packet.getData().readByte()); + config->setMainHand(packet.getData().readVarInt()); + config->setTextFiltering(packet.getData().readByte() != 0); + config->setServerListings(packet.getData().readByte() != 0); + + (void)server; +} diff --git a/src/networking/packet/serverbound/handleConfirmTeleportation.cpp b/src/networking/packet/serverbound/handleConfirmTeleportation.cpp new file mode 100644 index 0000000..d266bb5 --- /dev/null +++ b/src/networking/packet/serverbound/handleConfirmTeleportation.cpp @@ -0,0 +1,17 @@ +#include "packet.hpp" +#include "server.hpp" +#include + +void handleConfirmTeleportation(Packet& packet, Server& server) { + std::cout << "=== Received Confirm Teleportation ===\n"; + + // Read teleport ID from packet data + int teleportId = packet.getData().readVarInt(); + + std::cout << "Player confirmed teleportation with ID: " << teleportId << std::endl; + + // Mark packet as processed + packet.setReturnPacket(PACKET_OK); + + (void)server; +} diff --git a/src/networking/packet/handshake.cpp b/src/networking/packet/serverbound/handshake.cpp similarity index 72% rename from src/networking/packet/handshake.cpp rename to src/networking/packet/serverbound/handshake.cpp index bbe728d..f44ab58 100644 --- a/src/networking/packet/handshake.cpp +++ b/src/networking/packet/serverbound/handshake.cpp @@ -1,7 +1,7 @@ -#include "packet.hpp" -#include "player.hpp" -#include "server.hpp" #include "logger.hpp" +#include "network/packet.hpp" +#include "network/server.hpp" +#include "player.hpp" #include #include @@ -13,11 +13,12 @@ void handleHandshakePacket(Packet& packet, Server& server) { packet.setReturnPacket(PACKET_DISCONNECT); return; } - int protocolVersion = packet.getData().readVarInt(); - std::string serverAddr = packet.getData().readString(255); - uint16_t port = packet.getData().readUShort(); - int nextState = packet.getData().readVarInt(); - // g_logger->logNetwork(INFO, "Protocol=" + std::to_string(protocolVersion) + ", Addr=" + serverAddr + ", State=" + std::to_string(nextState), "Handshake"); + int protocolVersion = packet.getData().readVarInt(); + std::string serverAddr = packet.getData().readString(255); + uint16_t port = packet.getData().readUShort(); + int nextState = packet.getData().readVarInt(); + // g_logger->logNetwork(INFO, "Protocol=" + std::to_string(protocolVersion) + ", Addr=" + + // serverAddr + ", State=" + std::to_string(nextState), "Handshake"); if (nextState == 1) { packet.getPlayer()->setPlayerState(PlayerState::Status); // g_logger->logNetwork(INFO, "Status request - keeping in temp list", "Handshake"); diff --git a/src/networking/packet/serverbound/loginAcknowledged.cpp b/src/networking/packet/serverbound/loginAcknowledged.cpp new file mode 100644 index 0000000..47d9d0b --- /dev/null +++ b/src/networking/packet/serverbound/loginAcknowledged.cpp @@ -0,0 +1,35 @@ +#include "logger.hpp" +#include "network/networking.hpp" +#include "network/packet.hpp" +#include "network/server.hpp" +#include "player.hpp" + +#include + +void handleLoginAcknowledged(Packet& packet, Server& server) { + // g_logger->logNetwork(INFO, "Login Acknowledged received - transitioning to Configuration + // state", "Login"); + + Player* player = packet.getPlayer(); + if (!player) { + // g_logger->logNetwork(ERROR, "Error: No player associated with Login Acknowledged packet", + // "Login"); + packet.setReturnPacket(PACKET_DISCONNECT); + return; + } + + // The Login Acknowledged packet has no payload (0 bytes), so nothing to read + + // The client has acknowledged the login success, now we officially transition to Configuration + // state + player->setPlayerState(PlayerState::Configuration); + + // g_logger->logNetwork(INFO, "Player " + player->getPlayerName() + " successfully acknowledged + // login - transitioned to Configuration state", "Login"); + + // Just acknowledge the packet - don't send anything yet + // The client will send Client Information (packet 0x03) next in Configuration state + packet.setReturnPacket(PACKET_OK); + + (void)server; // Suppress unused parameter warning +} diff --git a/src/networking/packet/serverbound/serverboundKnowPacks.cpp b/src/networking/packet/serverbound/serverboundKnowPacks.cpp new file mode 100644 index 0000000..6b6a372 --- /dev/null +++ b/src/networking/packet/serverbound/serverboundKnowPacks.cpp @@ -0,0 +1,18 @@ +#include "buffer.hpp" +#include "logger.hpp" +#include "network/packet.hpp" + +#include + +void serverboundKnownPacks(Packet& packet) { + int size = packet.getData().readVarInt(); + + std::cout << "Received " << size << " known packs." << std::endl; + + for (int i = 0; i < size; ++i) { + std::string name = packet.getData().readString(10000); + std::string id = packet.getData().readString(10000); + std::string version = packet.getData().readString(10000); + std::cout << "Pack " << i + 1 << ": " << name << " | " << id << " | " << version << std::endl; + } +} diff --git a/src/networking/packet/setCenterChunck.cpp b/src/networking/packet/setCenterChunck.cpp index 6b84f5b..5e161be 100644 --- a/src/networking/packet/setCenterChunck.cpp +++ b/src/networking/packet/setCenterChunck.cpp @@ -1,9 +1,9 @@ -#include "UUID.hpp" -#include "buffer.hpp" -#include "networking.hpp" -#include "packet.hpp" +#include "lib/UUID.hpp" +#include "network/buffer.hpp" +#include "network/networking.hpp" +#include "network/packet.hpp" +#include "network/server.hpp" #include "player.hpp" -#include "server.hpp" #include @@ -14,8 +14,8 @@ void writeSetCenterPacket(Packet& packet, Server& server) { buf.writeVarInt(0); buf.writeVarInt(0); - int packetId = 0x57; - int packetIdSize = packet.getVarintSize(packetId); + int packetId = 0x57; + int packetIdSize = packet.getVarintSize(packetId); int totalPayloadSize = packetIdSize + buf.getData().size(); Buffer finalBuf; diff --git a/src/networking/packet/spawnSequence.cpp b/src/networking/packet/spawnSequence.cpp index 4473443..9459368 100644 --- a/src/networking/packet/spawnSequence.cpp +++ b/src/networking/packet/spawnSequence.cpp @@ -1,216 +1,205 @@ -#include "UUID.hpp" -#include "buffer.hpp" -#include "networking.hpp" -#include "packet.hpp" +#include "lib/UUID.hpp" +#include "network/buffer.hpp" +#include "network/networking.hpp" +#include "network/packet.hpp" +#include "network/server.hpp" #include "player.hpp" -#include "server.hpp" #include void sendPlayerAbilities(Packet& packet, Server& server) { - std::cout << "=== Sending Player Abilities ===\n"; + std::cout << "=== Sending Player Abilities ===\n"; - Buffer buf; + Buffer buf; - // Flags (byte) - bit field for player abilities - uint8_t flags = 0x00; - // 0x01: Invulnerable - // 0x02: Flying - // 0x04: Allow Flying (creative mode) - // 0x08: Creative Mode (instant break) - buf.writeByte(flags); + // Flags (byte) - bit field for player abilities + uint8_t flags = 0x00; + // 0x01: Invulnerable + // 0x02: Flying + // 0x04: Allow Flying (creative mode) + // 0x08: Creative Mode (instant break) + buf.writeByte(flags); - // Flying Speed (float) - 0.05 by default - // Convert 0.05f to IEEE 754 bits: 0x3D4CCCCD - buf.writeInt(0x3D4CCCCD); + // Flying Speed (float) - 0.05 by default + // Convert 0.05f to IEEE 754 bits: 0x3D4CCCCD + buf.writeInt(0x3D4CCCCD); - // Field of View Modifier (float) - 0.1 by default - // Convert 0.1f to IEEE 754 bits: 0x3DCCCCCD - buf.writeInt(0x3DCCCCCD); + // Field of View Modifier (float) - 0.1 by default + // Convert 0.1f to IEEE 754 bits: 0x3DCCCCCD + buf.writeInt(0x3DCCCCCD); - int packetId = 0x39; // Player Abilities packet ID for protocol 770 - int packetIdSize = packet.getVarintSize(packetId); - int totalPayloadSize = packetIdSize + buf.getData().size(); + int packetId = 0x39; // Player Abilities packet ID for protocol 770 + int packetIdSize = packet.getVarintSize(packetId); + int totalPayloadSize = packetIdSize + buf.getData().size(); - Buffer finalBuf; - finalBuf.writeVarInt(totalPayloadSize); - finalBuf.writeVarInt(packetId); - finalBuf.writeBytes(buf.getData()); + Buffer finalBuf; + finalBuf.writeVarInt(totalPayloadSize); + finalBuf.writeVarInt(packetId); + finalBuf.writeBytes(buf.getData()); - packet.getData() = finalBuf; - packet.setPacketSize(finalBuf.getData().size()); - packet.setReturnPacket(PACKET_SEND); + packet.getData() = finalBuf; + packet.setPacketSize(finalBuf.getData().size()); + packet.setReturnPacket(PACKET_SEND); - (void)server; + (void)server; } void sendSetHealth(Packet& packet, Server& server) { - std::cout << "=== Sending Set Health ===\n"; + std::cout << "=== Sending Set Health ===\n"; - Buffer buf; + Buffer buf; - // Health (float) - 20.0 = full health - // Convert 20.0f to IEEE 754 bits: 0x41A00000 - buf.writeInt(0x41A00000); + // Health (float) - 20.0 = full health + // Convert 20.0f to IEEE 754 bits: 0x41A00000 + buf.writeInt(0x41A00000); - // Food (VarInt) - 20 = full food bar - buf.writeVarInt(20); + // Food (VarInt) - 20 = full food bar + buf.writeVarInt(20); - // Food Saturation (float) - 5.0 by default - // Convert 5.0f to IEEE 754 bits: 0x40A00000 - buf.writeInt(0x40A00000); + // Food Saturation (float) - 5.0 by default + // Convert 5.0f to IEEE 754 bits: 0x40A00000 + buf.writeInt(0x40A00000); - int packetId = 0x61; // Set Health packet ID for protocol 770 - int packetIdSize = packet.getVarintSize(packetId); - int totalPayloadSize = packetIdSize + buf.getData().size(); + int packetId = 0x61; // Set Health packet ID for protocol 770 + int packetIdSize = packet.getVarintSize(packetId); + int totalPayloadSize = packetIdSize + buf.getData().size(); - Buffer finalBuf; - finalBuf.writeVarInt(totalPayloadSize); - finalBuf.writeVarInt(packetId); - finalBuf.writeBytes(buf.getData()); + Buffer finalBuf; + finalBuf.writeVarInt(totalPayloadSize); + finalBuf.writeVarInt(packetId); + finalBuf.writeBytes(buf.getData()); - packet.getData() = finalBuf; - packet.setPacketSize(finalBuf.getData().size()); - packet.setReturnPacket(PACKET_SEND); + packet.getData() = finalBuf; + packet.setPacketSize(finalBuf.getData().size()); + packet.setReturnPacket(PACKET_SEND); - (void)server; + (void)server; } void sendSetExperience(Packet& packet, Server& server) { - std::cout << "=== Sending Set Experience ===\n"; + std::cout << "=== Sending Set Experience ===\n"; - Buffer buf; + Buffer buf; - // Experience bar (float) - 0.0 to 1.0 (progress to next level) - // Convert 0.0f to IEEE 754 bits: 0x00000000 - buf.writeInt(0x00000000); + // Experience bar (float) - 0.0 to 1.0 (progress to next level) + // Convert 0.0f to IEEE 754 bits: 0x00000000 + buf.writeInt(0x00000000); - // Level (VarInt) - current experience level - buf.writeVarInt(0); + // Level (VarInt) - current experience level + buf.writeVarInt(5); - // Total Experience (VarInt) - total experience points - buf.writeVarInt(0); + // Total Experience (VarInt) - total experience points + buf.writeVarInt(0); - int packetId = 0x60; // Set Experience packet ID for protocol 770 - int packetIdSize = packet.getVarintSize(packetId); - int totalPayloadSize = packetIdSize + buf.getData().size(); + int packetId = 0x60; // Set Experience packet ID for protocol 770 + int packetIdSize = packet.getVarintSize(packetId); + int totalPayloadSize = packetIdSize + buf.getData().size(); - Buffer finalBuf; - finalBuf.writeVarInt(totalPayloadSize); - finalBuf.writeVarInt(packetId); - finalBuf.writeBytes(buf.getData()); + Buffer finalBuf; + finalBuf.writeVarInt(totalPayloadSize); + finalBuf.writeVarInt(packetId); + finalBuf.writeBytes(buf.getData()); - packet.getData() = finalBuf; - packet.setPacketSize(finalBuf.getData().size()); - packet.setReturnPacket(PACKET_SEND); + packet.getData() = finalBuf; + packet.setPacketSize(finalBuf.getData().size()); + packet.setReturnPacket(PACKET_SEND); - (void)server; + (void)server; } void sendUpdateTime(Packet& packet, Server& server) { - std::cout << "=== Sending Update Time ===\n"; + std::cout << "=== Sending Update Time ===\n"; - Buffer buf; + Buffer buf; - // World Age (Long) - total ticks since world creation - buf.writeLong(0); + // World Age (Long) - total ticks since world creation + buf.writeLong(0); - // Time of day (Long) - 0 = sunrise, 6000 = noon, 12000 = sunset, 18000 = midnight - buf.writeLong(1000); // Morning time + // Time of day (Long) - 0 = sunrise, 6000 = noon, 12000 = sunset, 18000 = midnight + buf.writeLong(1000); // Morning time - // Time of day increasing (Boolean) - should client auto-advance time - buf.writeByte(0x01); // true + // Time of day increasing (Boolean) - should client auto-advance time + buf.writeByte(0x01); // true - int packetId = 0x6A; // Update Time packet ID for protocol 770 - int packetIdSize = packet.getVarintSize(packetId); - int totalPayloadSize = packetIdSize + buf.getData().size(); + int packetId = 0x6A; // Update Time packet ID for protocol 770 + int packetIdSize = packet.getVarintSize(packetId); + int totalPayloadSize = packetIdSize + buf.getData().size(); - Buffer finalBuf; - finalBuf.writeVarInt(totalPayloadSize); - finalBuf.writeVarInt(packetId); - finalBuf.writeBytes(buf.getData()); + Buffer finalBuf; + finalBuf.writeVarInt(totalPayloadSize); + finalBuf.writeVarInt(packetId); + finalBuf.writeBytes(buf.getData()); - packet.getData() = finalBuf; - packet.setPacketSize(finalBuf.getData().size()); - packet.setReturnPacket(PACKET_SEND); + packet.getData() = finalBuf; + packet.setPacketSize(finalBuf.getData().size()); + packet.setReturnPacket(PACKET_SEND); - (void)server; + (void)server; } void sendSetHeldItem(Packet& packet, Server& server) { - std::cout << "=== Sending Set Held Item ===\n"; + std::cout << "=== Sending Set Held Item ===\n"; - Buffer buf; + Buffer buf; - // Slot (VarInt) - hotbar slot selected (0-8) - buf.writeVarInt(0); // First slot selected + // Slot (VarInt) - hotbar slot selected (0-8) + buf.writeVarInt(0); // First slot selected - int packetId = 0x62; // Set Held Item packet ID for protocol 770 - int packetIdSize = packet.getVarintSize(packetId); - int totalPayloadSize = packetIdSize + buf.getData().size(); + int packetId = 0x62; // Set Held Item packet ID for protocol 770 + int packetIdSize = packet.getVarintSize(packetId); + int totalPayloadSize = packetIdSize + buf.getData().size(); - Buffer finalBuf; - finalBuf.writeVarInt(totalPayloadSize); - finalBuf.writeVarInt(packetId); - finalBuf.writeBytes(buf.getData()); + Buffer finalBuf; + finalBuf.writeVarInt(totalPayloadSize); + finalBuf.writeVarInt(packetId); + finalBuf.writeBytes(buf.getData()); - packet.getData() = finalBuf; - packet.setPacketSize(finalBuf.getData().size()); - packet.setReturnPacket(PACKET_SEND); + packet.getData() = finalBuf; + packet.setPacketSize(finalBuf.getData().size()); + packet.setReturnPacket(PACKET_SEND); - (void)server; + (void)server; } -void handleConfirmTeleportation(Packet& packet, Server& server) { - std::cout << "=== Received Confirm Teleportation ===\n"; - // Read teleport ID from packet data - int teleportId = packet.getData().readVarInt(); +void completeSpawnSequence(Packet& packet, Server& server) { + Player* player = packet.getPlayer(); + ThreadSafeQueue* outgoingPackets = server.getNetworkManager().getOutgoingQueue(); + if (!player || !outgoingPackets) return; - std::cout << "Player confirmed teleportation with ID: " << teleportId << std::endl; + // std::cout << "=== Completing spawn sequence for player: " << player->getPlayerName() << " + // ===\n"; + std::cout << "=== Completing spawn sequence for player: " << " ===\n"; - // Mark packet as processed - packet.setReturnPacket(PACKET_OK); + try { + // 9. Player Abilities (0x39) + Packet* abilitiesPacket = new Packet(packet); + sendPlayerAbilities(*abilitiesPacket, server); + outgoingPackets->push(abilitiesPacket); - (void)server; -} - -void completeSpawnSequence(Packet& packet, Server& server, ThreadSafeQueue* outgoingPackets) { - Player* player = packet.getPlayer(); - if (!player || !outgoingPackets) return; - - // std::cout << "=== Completing spawn sequence for player: " << player->getPlayerName() << " ===\n"; - std::cout << "=== Completing spawn sequence for player: " << " ===\n"; - - try { - // 9. Player Abilities (0x39) - Packet* abilitiesPacket = new Packet(packet); - sendPlayerAbilities(*abilitiesPacket, server); - outgoingPackets->push(abilitiesPacket); - - // 10. Set Health (0x61) - Packet* healthPacket = new Packet(packet); - sendSetHealth(*healthPacket, server); - outgoingPackets->push(healthPacket); + // 10. Set Health (0x61) + Packet* healthPacket = new Packet(packet); + sendSetHealth(*healthPacket, server); + outgoingPackets->push(healthPacket); - // 11. Set Experience (0x60) - Packet* experiencePacket = new Packet(packet); - sendSetExperience(*experiencePacket, server); - outgoingPackets->push(experiencePacket); + // 11. Set Experience (0x60) + Packet* experiencePacket = new Packet(packet); + sendSetExperience(*experiencePacket, server); + outgoingPackets->push(experiencePacket); - // 12. Update Time (0x6A) - Packet* timePacket = new Packet(packet); - sendUpdateTime(*timePacket, server); - outgoingPackets->push(timePacket); + // 12. Update Time (0x6A) + Packet* timePacket = new Packet(packet); + sendUpdateTime(*timePacket, server); + outgoingPackets->push(timePacket); - // 13. Set Held Item (0x62) - Packet* heldItemPacket = new Packet(packet); - sendSetHeldItem(*heldItemPacket, server); - outgoingPackets->push(heldItemPacket); + // 13. Set Held Item (0x62) + Packet* heldItemPacket = new Packet(packet); + sendSetHeldItem(*heldItemPacket, server); + outgoingPackets->push(heldItemPacket); - std::cout << "=== Spawn sequence completed! Player should now be fully spawned ===\n"; + std::cout << "=== Spawn sequence completed! Player should now be fully spawned ===\n"; - } catch (const std::exception& e) { - std::cerr << "Error completing spawn sequence: " << e.what() << std::endl; - } + } catch (const std::exception& e) { + std::cerr << "Error completing spawn sequence: " << e.what() << std::endl; + } } diff --git a/src/networking/packet/templateClientBoundPacket.cpp b/src/networking/packet/templateClientBoundPacket.cpp new file mode 100644 index 0000000..1c1df6c --- /dev/null +++ b/src/networking/packet/templateClientBoundPacket.cpp @@ -0,0 +1,16 @@ +#include "buffer.hpp" +#include "packet.hpp" + +void templateClientBoundPacket(Packet& packet) { + Buffer buff; + + // Add packet id, and data. + + Buffer final; + final.writeVarInt(buff.getData().size()); + final.writeBytes(buff.getData()); + + packet.getData() = final; + packet.setPacketSize(final.getData().size()); + packet.setReturnPacket(PACKET_SEND); +} diff --git a/src/player.cpp b/src/player.cpp deleted file mode 100644 index e3c05c0..0000000 --- a/src/player.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include "UUID.hpp" -#include "player.hpp" -#include "server.hpp" - -#include - -Player::Player(Server& server) - : _name("Player_entity"), _state(PlayerState::None), _socketFd(-1), x(0), y(0), z(0), health(0), - _uuid(), _playerId(server.getIdManager().allocate()), _server(server), _config(new PlayerConfig()) {} - -Player::Player(const std::string& name, const PlayerState state, const int socket, Server& server) - : _state(state), _socketFd(socket), x(0), y(0), z(0), health(20), _uuid(), - _playerId(server.getIdManager().allocate()), _server(server), _config(new PlayerConfig()) { - if (name.length() > 32) - _name = name.substr(0, 31); - else - _name = name; -} - -Player& Player::operator=(const Player& src) { - if (this != &src) { - this->_name = src._name; - this->_socketFd = src._socketFd; - this->health = src.health; - this->x = src.x; - this->y = src.y; - this->z = src.z; - } - return (*this); -} - -Player::~Player() { - _server.getIdManager().release(_playerId); - delete _config; -} - -std::string Player::getPlayerName(void) { - return (this->_name); -}; -void Player::setPlayerName(const std::string& name) { - this->_name = name; -} -PlayerState Player::getPlayerState() { - return (this->_state); -} -void Player::setPlayerState(PlayerState state) { - this->_state = state; -} -void Player::setSocketFd(int socket) { - this->_socketFd = socket; -} -int Player::getSocketFd() const { - return (this->_socketFd); -} - -void Player::setUUID(UUID uuid) { - _uuid = uuid; -} - -int Player::getPlayerID() const { - return (_playerId); -} - -// PlayerConfig implementation -PlayerConfig::PlayerConfig() - : _chatMode(0), _mainHand(1), _locale("en_US"), _viewDistance(10), - _displayedSkinParts(0), _chatColors(true), _enableTextFiltering(false), - _allowServerListings(true) {} - -PlayerConfig::~PlayerConfig() {} diff --git a/src/server.cpp b/src/server.cpp index 8c16f4a..94d528e 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -1,21 +1,23 @@ -#include "json.hpp" +#include "config.hpp" +#include "lib/filesystem.hpp" +#include "lib/json.hpp" #include "logger.hpp" -#include "networking.hpp" +#include "network/networking.hpp" +#include "network/server.hpp" #include "player.hpp" -#include "server.hpp" +#include "world/world.hpp" #include +#include #include -#include +#include #include #include #include using json = nlohmann::json; -Server::Server() - : _playerLst(), _protocolVersion(770), _serverSize(-100000000), _gameVersion("1.12.5"), - _serverMOTD(), _serverPort(25565), _serverAddr("0.0.0.0"), _networkManager(nullptr) {} +Server::Server() : _playerLst(), _config(), _networkManager(nullptr), _worldQuery(_worldManager) {} Server::~Server() { if (_networkManager) { @@ -26,11 +28,54 @@ Server::~Server() { int Server::start_server() { try { - initializeGlobalLogger(); - Server::loadConfig(); + initializeGlobalLogger(); + if (_config.loadConfig()) { + g_logger->logGameInfo(ERROR, "Failed to load config", "SERVER"); + return 1; + } + + // Load world data + g_logger->logGameInfo(INFO, "Loading world...", "SERVER"); + try { + std::string worldName = _config.getWorldName(); + std::filesystem::path levelDatPath = getPath().parent_path() / worldName / "level.dat"; + + if (!std::filesystem::exists(levelDatPath)) { + g_logger->logGameInfo(ERROR, "level.dat not found at: " + levelDatPath.string(), "SERVER"); + return 1; + } + + _worldData = _worldManager.loadLevelDat(levelDatPath); + + // Log world information + g_logger->logGameInfo(INFO, "World loaded successfully: " + _worldData.LevelName, "SERVER"); + g_logger->logGameInfo(INFO, + "Spawn Point: X=" + std::to_string(_worldData.SpawnX) + " Y=" + std::to_string(_worldData.SpawnY) + + " Z=" + std::to_string(_worldData.SpawnZ), + "SERVER"); + g_logger->logGameInfo(INFO, "Random Seed: " + std::to_string(_worldData.RandomSeed), "SERVER"); + g_logger->logGameInfo(INFO, "Game Type: " + std::to_string(_worldData.GameType), "SERVER"); + g_logger->logGameInfo(INFO, "Data Version: " + std::to_string(_worldData.DataVersion), "SERVER"); + g_logger->logGameInfo(INFO, "Difficulty: " + std::to_string(static_cast(_worldData.Difficulty)), "SERVER"); + g_logger->logGameInfo(INFO, "Hardcore: " + std::string(_worldData.hardcore ? "true" : "false"), "SERVER"); + g_logger->logGameInfo(INFO, "Time: " + std::to_string(_worldData.Time), "SERVER"); + g_logger->logGameInfo(INFO, "Day Time: " + std::to_string(_worldData.DayTime), "SERVER"); + g_logger->logGameInfo(INFO, "Generator: " + _worldData.generatorName, "SERVER"); + g_logger->logGameInfo(INFO, "Raining: " + std::string(_worldData.raining ? "true" : "false"), "SERVER"); + g_logger->logGameInfo(INFO, "Thundering: " + std::string(_worldData.thundering ? "true" : "false"), "SERVER"); + + } catch (const std::exception& e) { + g_logger->logGameInfo(ERROR, "Failed to load world: " + std::string(e.what()), "SERVER"); + return 1; + } + + std::filesystem::path regionFile = _worldManager.locateRegionFileByChunkCoord(0, 0); + g_logger->logGameInfo(INFO, "Region File: " + regionFile.string(), "SERVER"); + World::ChunkData chunk = _worldQuery.fetchChunk(0, 0); + printChunkInfo(chunk); + size_t workerCount = 4; - if (workerCount == 0) - workerCount = 4; // fallback + if (workerCount == 0) workerCount = 4; // fallback // Create NetworkManager with BOTH required parameters _networkManager = new NetworkManager(workerCount, *this); @@ -48,39 +93,6 @@ int Server::start_server() { return (0); } -int Server::loadConfig() { - std::ifstream inputFile(ConfigFileName); - - if (!inputFile.is_open()) { - std::cerr << "[Server] Error: Could not open " << ConfigFileName << std::endl; - return 1; - } - - json j; - - try { - inputFile >> j; - - // g_logger->logGameInfo(INFO, "Successfully parsed " + std::string(ConfigFileName) + "!", "Server"); - _gameVersion = j["version"]["name"]; - // g_logger->logGameInfo(INFO, "Game version: " + _gameVersion, "Server"); - _protocolVersion = j["version"]["protocol"]; - // g_logger->logGameInfo(INFO, "Protocol version: " + std::to_string(_protocolVersion), "Server"); - _serverSize = j["server"]["max-players"]; - // g_logger->logGameInfo(INFO, "Server size: " + std::to_string(_serverSize), "Server"); - _serverMOTD = j["server"]["motd"]; - // g_logger->logGameInfo(INFO, "Server MOTD: " + _serverMOTD, "Server"); - _serverAddr = j["server"]["ip-address"]; - // g_logger->logGameInfo(INFO, "Server IP address : " + _serverAddr, "Server"); - _serverPort = j["server"]["port"]; - // g_logger->logGameInfo(INFO, "Server port: " + std::to_string(_serverPort), "Server"); - } catch (json::parse_error& e) { - std::cerr << "[Server]: Json parse error: " << e.what() << std::endl; - return (1); - } - return (0); -} - Player* Server::addPlayer(const std::string& name, const PlayerState state, const int socket) { Player* newPlayer = nullptr; try { @@ -119,7 +131,8 @@ Player* Server::addTempPlayer(const std::string& name, const PlayerState state, std::lock_guard lock(_tempPlayerLock); _tempPlayerLst[socket] = newPlayer; - // g_logger->logGameInfo(INFO, "Added temp player on socket " + std::to_string(socket), "Server"); + // g_logger->logGameInfo(INFO, "Added temp player on socket " + std::to_string(socket), + // "Server"); return (newPlayer); } @@ -127,16 +140,16 @@ void Server::removeTempPlayer(Player* player) { if (!player) { return; } - int socket = player->getSocketFd(); + int socket = player->getSocketFd(); std::lock_guard lock(_tempPlayerLock); _tempPlayerLst.erase(socket); delete player; - // g_logger->logGameInfo(INFO, "Removed temp player from socket " + std::to_string(socket), "Server"); + // g_logger->logGameInfo(INFO, "Removed temp player from socket " + std::to_string(socket), + // "Server"); } void Server::promoteTempPlayer(Player* player) { - if (!player) - return; + if (!player) return; int socket = player->getSocketFd(); std::lock_guard lockTemp(_tempPlayerLock); @@ -145,7 +158,8 @@ void Server::promoteTempPlayer(Player* player) { std::lock_guard lockPlayer(_playerLock); _playerLst[socket] = player; - // g_logger->logGameInfo(INFO, "Promoted temp player to main list on socket " + std::to_string(socket), "Server"); + // g_logger->logGameInfo(INFO, "Promoted temp player to main list on socket " + + // std::to_string(socket), "Server"); } void Server::removePlayerFromAnyList(Player* player) { @@ -156,32 +170,33 @@ void Server::removePlayerFromAnyList(Player* player) { { std::lock_guard lock(_tempPlayerLock); - auto temp_it = _tempPlayerLst.find(socket); + auto temp_it = _tempPlayerLst.find(socket); if (temp_it != _tempPlayerLst.end()) { _tempPlayerLst.erase(socket); delete player; - // g_logger->logGameInfo(INFO, "Removed temp player from socket " + std::to_string(socket), "Server"); + // g_logger->logGameInfo(INFO, "Removed temp player from socket " + + // std::to_string(socket), "Server"); return; } } { std::lock_guard lock(_playerLock); - auto main_it = _playerLst.find(socket); + auto main_it = _playerLst.find(socket); if (main_it != _playerLst.end()) { _playerLst.erase(socket); delete player; - // g_logger->logGameInfo(INFO, "Removed main player from socket " + std::to_string(socket), "Server"); + // g_logger->logGameInfo(INFO, "Removed main player from socket " + + // std::to_string(socket), "Server"); return; } } delete player; - // g_logger->logGameInfo(INFO, "Deleted orphaned player from socket " + std::to_string(socket), "Server"); + // g_logger->logGameInfo(INFO, "Deleted orphaned player from socket " + std::to_string(socket), + // "Server"); } -void Server::addPlayerToSample(const std::string& name) { - _playerSample.push_back(name); -} +void Server::addPlayerToSample(const std::string& name) { _playerSample.push_back(name); } void Server::removePlayerToSample(const std::string& name) { for (size_t i = 0; i < _playerLst.size(); i++) @@ -191,21 +206,88 @@ void Server::removePlayerToSample(const std::string& name) { } } -std::string Server::getGameVersion() { - return _gameVersion; -} -std::string Server::getServerMOTD() { - return _serverMOTD; -} -int Server::getProtocolVersion() { - return _protocolVersion; -} -int Server::getServerSize() { - return _serverSize; -} -int Server::getAmountOnline() { - return _playerLst.size(); -} -json Server::getPlayerSample() { - return _playerSample; +int Server::getAmountOnline() { return _playerLst.size(); } +json Server::getPlayerSample() { return _playerSample; } + +void Server::printChunkInfo(const World::ChunkData& chunk) { + g_logger->logGameInfo(INFO, "========== CHUNK DATA INFO ==========", "SERVER"); + + // Basic chunk information + g_logger->logGameInfo(INFO, "Chunk Coordinates: (" + std::to_string(chunk.chunkX) + ", " + std::to_string(chunk.chunkZ) + ")", "SERVER"); + g_logger->logGameInfo(INFO, "Chunk Empty: " + std::string(chunk.isEmpty() ? "true" : "false"), "SERVER"); + + // Data vector sizes + g_logger->logGameInfo(INFO, "Block Data Size: " + std::to_string(chunk.blockData.size()) + " bytes", "SERVER"); + g_logger->logGameInfo(INFO, "Biome Data Size: " + std::to_string(chunk.biomeData.size()) + " bytes", "SERVER"); + g_logger->logGameInfo(INFO, "Heightmaps Size: " + std::to_string(chunk.heightmaps.size()) + " bytes", "SERVER"); + g_logger->logGameInfo(INFO, "Block Entities Size: " + std::to_string(chunk.blockEntities.size()) + " bytes", "SERVER"); + g_logger->logGameInfo(INFO, "Sky Light Size: " + std::to_string(chunk.skyLight.size()) + " bytes", "SERVER"); + g_logger->logGameInfo(INFO, "Block Light Size: " + std::to_string(chunk.blockLight.size()) + " bytes", "SERVER"); + + // Calculate total data size + size_t totalSize = chunk.blockData.size() + chunk.biomeData.size() + chunk.heightmaps.size() + chunk.blockEntities.size() + + chunk.skyLight.size() + chunk.blockLight.size(); + g_logger->logGameInfo(INFO, "Total Chunk Data Size: " + std::to_string(totalSize) + " bytes", "SERVER"); + + // Analyze data content + if (!chunk.blockData.empty()) { + g_logger->logGameInfo(INFO, "Block Data: Contains " + std::to_string(chunk.blockData.size()) + " bytes of NBT block sections", "SERVER"); + + // Try to parse some basic NBT info if possible + try { + if (chunk.blockData.size() > 10) { + // Show first few bytes as hex for debugging + std::string hexStr = "First 10 bytes (hex): "; + for (size_t i = 0; i < std::min(static_cast(10), chunk.blockData.size()); ++i) { + char hexChar[4]; + snprintf(hexChar, sizeof(hexChar), "%02X ", static_cast(chunk.blockData[i])); + hexStr += hexChar; + } + g_logger->logGameInfo(DEBUG, hexStr, "SERVER"); + } + } catch (const std::exception& e) { + g_logger->logGameInfo(DEBUG, "Could not analyze block data: " + std::string(e.what()), "SERVER"); + } + } else { + g_logger->logGameInfo(INFO, "Block Data: Empty (chunk not generated or air-only)", "SERVER"); + } + + if (!chunk.biomeData.empty()) { + g_logger->logGameInfo(INFO, "Biome Data: Contains biome information for 4x4x4 block cells", "SERVER"); + } else { + g_logger->logGameInfo(INFO, "Biome Data: Empty (default biome used)", "SERVER"); + } + + if (!chunk.heightmaps.empty()) { + g_logger->logGameInfo(INFO, "Heightmaps: Contains terrain height data for performance optimization", "SERVER"); + } else { + g_logger->logGameInfo(INFO, "Heightmaps: Empty (not calculated)", "SERVER"); + } + + if (!chunk.blockEntities.empty()) { + g_logger->logGameInfo(INFO, + "Block Entities: Contains " + std::to_string(chunk.blockEntities.size()) + + " bytes of special blocks (chests, furnaces, etc.)", + "SERVER"); + } else { + g_logger->logGameInfo(INFO, "Block Entities: No special blocks found", "SERVER"); + } + + if (!chunk.skyLight.empty()) { + g_logger->logGameInfo(INFO, "Sky Light: Contains natural lighting data (2048 bytes expected per 16x16x16 section)", "SERVER"); + } else { + g_logger->logGameInfo(INFO, "Sky Light: No sky light data (underground sections or not calculated)", "SERVER"); + } + + if (!chunk.blockLight.empty()) { + g_logger->logGameInfo(INFO, "Block Light: Contains artificial lighting data from torches, glowstone, etc.", "SERVER"); + } else { + g_logger->logGameInfo(INFO, "Block Light: No block light sources found", "SERVER"); + } + + // Minecraft chunk format info + g_logger->logGameInfo(INFO, "Note: Minecraft chunks are 16x384x16 blocks (Overworld) divided into 16x16x16 sections", "SERVER"); + g_logger->logGameInfo(INFO, "Note: Block data uses palletized format with NBT compression for efficiency", "SERVER"); + + g_logger->logGameInfo(INFO, "====================================", "SERVER"); } diff --git a/src/world/manager.cpp b/src/world/manager.cpp new file mode 100644 index 0000000..c537d03 --- /dev/null +++ b/src/world/manager.cpp @@ -0,0 +1,235 @@ +#include "lib/filesystem.hpp" +#include "lib/nbtParser.hpp" +#include "logger.hpp" +#include "world/world.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +std::vector World::Manager::decompressGzip(std::filesystem::path compressedFilePath) { + // Read file into memory + std::ifstream file(compressedFilePath, std::ios::binary); + if (!file) { + throw std::runtime_error("Could not open file: " + compressedFilePath.string()); + } + + std::vector compressed((std::istreambuf_iterator(file)), std::istreambuf_iterator()); + file.close(); + + // Initialize zlib stream + z_stream stream; + std::memset(&stream, 0, sizeof(stream)); + + // 16 + MAX_WBITS tells zlib to decode gzip format + if (inflateInit2(&stream, 16 + MAX_WBITS) != Z_OK) { + throw std::runtime_error("Failed to initialize gzip decompression"); + } + + // Allocate output buffer (level.dat is usually < 10MB) + std::vector decompressed(10 * 1024 * 1024); + + stream.avail_in = static_cast(compressed.size()); + stream.next_in = compressed.data(); + stream.avail_out = static_cast(decompressed.size()); + stream.next_out = decompressed.data(); + + int ret = inflate(&stream, Z_FINISH); + + if (ret != Z_STREAM_END) { + inflateEnd(&stream); + throw std::runtime_error("Decompression failed: " + std::to_string(ret)); + } + + // Resize to actual decompressed size + decompressed.resize(stream.total_out); + inflateEnd(&stream); + + return decompressed; +} + +World::LevelDat World::Manager::loadLevelDat(std::filesystem::path levelDatPath) { + std::vector decompressedData = decompressGzip(levelDatPath); + if (decompressedData.empty()) { + throw std::runtime_error("Decompressed level.dat data is empty."); + } + + // Parse NBT using the dedicated parser + nbt::Parser parser; + nbt::NBT n = parser.parse(decompressedData); + + World::LevelDat dataStruct; + dataStruct.nbtData = std::move(n); + + // --- Populate the Data struct for easy access --- + const auto& dataCompound = dataStruct.nbtData.getRoot().at("Data").get>(); + + // Helper to safely get a value from a compound tag + auto getTagValue = [&](const std::string& key, auto& member) { + using MemberType = std::remove_reference_t; + if (dataCompound->contains(key)) { + try { + if constexpr (std::is_same_v) { + // NBT uses TagByte for booleans + member = (dataCompound->at(key).get() != 0); + } else if constexpr (std::is_same_v) { + member = std::byte(dataCompound->at(key).get()); + } else { + member = dataCompound->at(key).get(); + } + } catch (const std::bad_variant_access&) { + // Type mismatch, leave member as default + } + } + }; + + getTagValue("allowCommands", dataStruct.allowCommands); + getTagValue("BorderCenterX", dataStruct.BorderCenterX); + getTagValue("BorderCenterY", dataStruct.BorderCenterY); + getTagValue("BorderDamagePerBlock", dataStruct.BorderDamagePerBlock); + getTagValue("BorderSafeZone", dataStruct.BorderSafeZone); + getTagValue("BorderSizeLerpTarget", dataStruct.BorderSizeLerpTarget); + getTagValue("BorderWarningBlocks", dataStruct.BorderWarningBlocks); + getTagValue("BorderWarningTime", dataStruct.BorderWarningTime); + getTagValue("clearWeatherTime", dataStruct.clearWeatherTime); + getTagValue("DataVersion", dataStruct.DataVersion); + getTagValue("DayTime", dataStruct.DayTime); + getTagValue("Difficulty", dataStruct.Difficulty); + getTagValue("DifficultyLocked", dataStruct.DifficultyLocked); + getTagValue("GameType", dataStruct.GameType); + getTagValue("generatorName", dataStruct.generatorName); + getTagValue("generatorVersion", dataStruct.generatorVersiona); + getTagValue("hardcore", dataStruct.hardcore); + getTagValue("initialized", dataStruct.initialized); + getTagValue("LastPlayed", dataStruct.LastPlayed); + getTagValue("LevelName", dataStruct.LevelName); + getTagValue("MapFeatures", dataStruct.MapFeatures); + getTagValue("raining", dataStruct.raining); + getTagValue("rainTime", dataStruct.rainTime); + getTagValue("RandomSeed", dataStruct.RandomSeed); + getTagValue("SizeOnDisk", dataStruct.SizeOnDisk); + getTagValue("SpawnX", dataStruct.SpawnX); + getTagValue("SpawnY", dataStruct.SpawnY); + getTagValue("SpawnZ", dataStruct.SpawnZ); + getTagValue("thundering", dataStruct.thundering); + getTagValue("thunderTime", dataStruct.thunderTime); + getTagValue("Time", dataStruct.Time); + getTagValue("version", dataStruct.version); + getTagValue("WanderingTraderSpawnChance", dataStruct.WanderingTraderSpawnChange); + getTagValue("WanderingTraderSpawnDelay", dataStruct.WanderingTraderSpawnDelay); + getTagValue("WasModded", dataStruct.WasModded); + + return dataStruct; +} + +std::filesystem::path World::Manager::locateRegionFileByChunkCoord(int localX, int localZ) { + const auto regionDir = getPath().parent_path() / "world" / "region"; + const std::string filename = "r." + std::to_string(localX / 32) + "." + std::to_string(localZ / 32) + ".mca"; + const std::filesystem::path path = regionDir / filename; + + if (std::filesystem::exists(path)) { + return path; + } else { + g_logger->logGameInfo(ERROR, "Cannot find the region file asked" + path.string()); + throw std::runtime_error("Cannot find the region file asked"); + } +} + +std::vector World::Manager::decompressZlib(const std::vector& compressedData) { + if (compressedData.empty()) { + return {}; + } + + // Initialize zlib stream + z_stream stream = {}; + stream.next_in = const_cast(compressedData.data()); + stream.avail_in = static_cast(compressedData.size()); + + // Initialize for zlib format (not gzip) + int ret = inflateInit(&stream); + if (ret != Z_OK) { + throw std::runtime_error("Failed to initialize zlib decompression"); + } + + // Estimate output size (start with 4x input size) + std::vector decompressed(compressedData.size() * 4); + + do { + stream.next_out = decompressed.data() + stream.total_out; + stream.avail_out = static_cast(decompressed.size() - stream.total_out); + + ret = inflate(&stream, Z_NO_FLUSH); + + if (ret == Z_STREAM_ERROR || ret == Z_DATA_ERROR || ret == Z_MEM_ERROR) { + inflateEnd(&stream); + throw std::runtime_error("Zlib decompression error: " + std::to_string(ret)); + } + + // If we need more space, double the buffer + if (stream.avail_out == 0 && ret != Z_STREAM_END) { + decompressed.resize(decompressed.size() * 2); + } + + } while (ret != Z_STREAM_END); + + inflateEnd(&stream); + + // Resize to actual decompressed size + decompressed.resize(stream.total_out); + return decompressed; +} + +std::vector World::Manager::decompressGzip(const std::vector& compressedData) { + if (compressedData.empty()) { + return {}; + } + + // Initialize zlib stream for gzip format + z_stream stream = {}; + stream.next_in = const_cast(compressedData.data()); + stream.avail_in = static_cast(compressedData.size()); + + // Use inflateInit2 with gzip flag (16 + MAX_WBITS) + int ret = inflateInit2(&stream, 16 + MAX_WBITS); + if (ret != Z_OK) { + throw std::runtime_error("Failed to initialize gzip decompression"); + } + + // Estimate output size (start with 4x input size) + std::vector decompressed(compressedData.size() * 4); + + do { + stream.next_out = decompressed.data() + stream.total_out; + stream.avail_out = static_cast(decompressed.size() - stream.total_out); + + ret = inflate(&stream, Z_NO_FLUSH); + + if (ret == Z_STREAM_ERROR || ret == Z_DATA_ERROR || ret == Z_MEM_ERROR) { + inflateEnd(&stream); + throw std::runtime_error("Gzip decompression error: " + std::to_string(ret)); + } + + // If we need more space, double the buffer + if (stream.avail_out == 0 && ret != Z_STREAM_END) { + decompressed.resize(decompressed.size() * 2); + } + + } while (ret != Z_STREAM_END); + + inflateEnd(&stream); + + // Resize to actual decompressed size + decompressed.resize(stream.total_out); + return decompressed; +} diff --git a/src/world/query.cpp b/src/world/query.cpp new file mode 100644 index 0000000..cdf6a01 --- /dev/null +++ b/src/world/query.cpp @@ -0,0 +1,217 @@ +#include "lib/nbt.hpp" +#include "lib/nbtParser.hpp" +#include "logger.hpp" +#include "world/world.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +World::ChunkData World::Query::loadChunkFromRegion(const std::filesystem::path& regionPath, int chunkX, int chunkZ) { + + // Get the byte index inside the location table + int localX = chunkX & 31, localZ = chunkZ & 31; + int chunkIndex = (localZ << 5) + localX; + + std::ifstream file(regionPath, std::ios::binary); + if (!file.is_open()) { + throw std::runtime_error("Cannot open region file"); + } + + file.seekg(chunkIndex * 4); + uint32_t locationData; + file.read(reinterpret_cast(&locationData), 4); + locationData = ntohl(locationData); + + uint32_t offset = (locationData >> 8) & 0xFFFFFF; + uint8_t sectorCount = locationData & 0xFF; + + if (offset == 0 || sectorCount == 0) { + // Chunk doesn't exist in this region + return ChunkData(chunkX, chunkZ); + } + + file.seekg(offset * 4096); + + uint32_t chunkLength; + file.read(reinterpret_cast(&chunkLength), 4); + chunkLength = ntohl(chunkLength); + + uint8_t compressionType; + file.read(reinterpret_cast(&compressionType), 1); + + std::vector compressedData(chunkLength - 1); + file.read(reinterpret_cast(compressedData.data()), chunkLength - 1); + + std::vector decompressedData; + switch (compressionType) { + case 1: // GZip + decompressedData = World::Manager::decompressGzip(compressedData); + break; + case 2: // Zlib + decompressedData = World::Manager::decompressZlib(compressedData); + break; + case 3: // Uncompressed + decompressedData = compressedData; + break; + default: + throw std::runtime_error("Unknown compression type: " + std::to_string(compressionType)); + }; + + nbt::Parser parser; + nbt::NBT chunkNBT = parser.parse(decompressedData); + + ChunkData chunk(chunkX, chunkZ); + extractChunkDataFromNBT(chunkNBT, chunk); + + return chunk; +} + +void World::Query::extractChunkDataFromNBT(const nbt::NBT& chunkNBT, World::ChunkData& chunk) { + try { + const auto& root = chunkNBT.getRoot(); + + // Modern format (1.18+) - data directly in root + + // Extract sections (block data) + if (root.contains("sections")) { + const auto& sectionsTag = root.at("sections").get>(); + extractSectionsData(*sectionsTag, chunk); + } + + // Extract heightmaps + if (root.contains("Heightmaps")) { + const auto& heightmapsTag = root.at("Heightmaps").get>(); + extractHeightmaps(*heightmapsTag, chunk); + } + + // Extract biomes from sections + extractBiomesFromSections(root, chunk); + + // Extract block entities + if (root.contains("block_entities")) { + const auto& blockEntitiesTag = root.at("block_entities").get>(); + extractBlockEntities(*blockEntitiesTag, chunk); + } + + } catch (const std::exception& e) { + g_logger->logGameInfo(ERROR, "Failed to extract chunk data from NBT: " + std::string(e.what()), "World::Query"); + // Leave chunk data empty - it will be treated as empty chunk + } +} + +void World::Query::extractSectionsData(const nbt::TagList& sections, World::ChunkData& chunk) { + for (size_t i = 0; i < sections.size(); i++) { + const auto& sectionTag = sections[i].get>(); + + // Get section Y coordinate + int8_t sectionY = 0; + if (sectionTag->contains("Y")) { + sectionY = sectionTag->at("Y").get(); + } + + // Extract block states + if (sectionTag->contains("block_states")) { + const auto& blockStatesTag = sectionTag->at("block_states").get>(); + extractBlockStatesFromSection(*blockStatesTag, chunk, sectionY); + } + + // Extract light data if present + if (sectionTag->contains("SkyLight")) { + const auto& skyLightTag = sectionTag->at("SkyLight").get(); + // Append to chunk.skyLight + size_t offset = chunk.skyLight.size(); + chunk.skyLight.resize(offset + skyLightTag.size()); + std::memcpy(chunk.skyLight.data() + offset, skyLightTag.data(), skyLightTag.size()); + } + + if (sectionTag->contains("BlockLight")) { + const auto& blockLightTag = sectionTag->at("BlockLight").get(); + // Append to chunk.blockLight + size_t offset = chunk.blockLight.size(); + chunk.blockLight.resize(offset + blockLightTag.size()); + std::memcpy(chunk.blockLight.data() + offset, blockLightTag.data(), blockLightTag.size()); + } + } +} + +void World::Query::extractBlockStatesFromSection(const nbt::TagCompound& blockStates, World::ChunkData& chunk, int8_t sectionY) { + // Block states contain palette and packed data array + + if (blockStates.contains("data")) { + const auto& dataTag = blockStates.at("data").get(); + + // For now, just append raw packed data + // In a full implementation, you'd unpack the bits based on palette size + size_t offset = chunk.blockData.size(); + chunk.blockData.resize(offset + dataTag.size() * sizeof(int64_t)); + std::memcpy(chunk.blockData.data() + offset, dataTag.data(), dataTag.size() * sizeof(int64_t)); + } + + // Note: To properly decode blocks, you'd also need to: + // 1. Read the "palette" array to get block state mappings + // 2. Calculate bits per entry based on palette size + // 3. Unpack the long array using the calculated bits per entry + // 4. Map indices back to actual block states using the palette +} + +void World::Query::extractHeightmaps(const nbt::TagCompound& heightmaps, World::ChunkData& chunk) { + // Modern chunks typically have multiple heightmap types + if (heightmaps.contains("MOTION_BLOCKING")) { + const auto& motionBlockingTag = heightmaps.at("MOTION_BLOCKING").get(); + + size_t dataSize = motionBlockingTag.size() * sizeof(int64_t); + chunk.heightmaps.resize(dataSize); + std::memcpy(chunk.heightmaps.data(), motionBlockingTag.data(), dataSize); + } +} + +void World::Query::extractBiomesFromSections(const nbt::TagCompound& root, World::ChunkData& chunk) { + // In modern format, biomes are stored in sections + if (root.contains("sections")) { + const auto& sectionsTag = root.at("sections").get>(); + + for (size_t i = 0; i < sectionsTag->size(); i++) { + const auto& sectionTag = (*sectionsTag)[i].get>(); + + if (sectionTag->contains("biomes")) { + const auto& biomesTag = sectionTag->at("biomes").get>(); + + if (biomesTag->contains("data")) { + const auto& biomeDataTag = biomesTag->at("data").get(); + + // Append biome data + size_t offset = chunk.biomeData.size(); + chunk.biomeData.resize(offset + biomeDataTag.size() * sizeof(int64_t)); + std::memcpy(chunk.biomeData.data() + offset, biomeDataTag.data(), biomeDataTag.size() * sizeof(int64_t)); + } + } + } + } +} + +void World::Query::extractBlockEntities(const nbt::TagList& blockEntities, World::ChunkData& chunk) { + // For now, just reserve some space + // In a full implementation, you'd serialize each block entity properly + chunk.blockEntities.reserve(blockEntities.size() * 100); // Rough estimate + + // You could iterate through and extract specific block entity data if needed + // For basic functionality, leaving empty is fine +} + +World::ChunkData World::Query::generateEmptyChunk(int chunkX, int chunkZ) { + World::ChunkData emptyChunk(chunkX, chunkZ); + + // Leave all vectors empty - this represents an empty chunk + // The isEmpty() function will return true for this chunk + + g_logger->logGameInfo(DEBUG, "Generated empty chunk (" + std::to_string(chunkX) + ", " + std::to_string(chunkZ) + ")", "World::Query"); + + return emptyChunk; +} diff --git a/world/DIM-1/data/chunks.dat b/world/DIM-1/data/chunks.dat new file mode 100644 index 0000000..4089fbc Binary files /dev/null and b/world/DIM-1/data/chunks.dat differ diff --git a/world/DIM-1/data/raids.dat b/world/DIM-1/data/raids.dat new file mode 100644 index 0000000..82c8463 Binary files /dev/null and b/world/DIM-1/data/raids.dat differ diff --git a/world/DIM1/data/chunks.dat b/world/DIM1/data/chunks.dat new file mode 100644 index 0000000..4089fbc Binary files /dev/null and b/world/DIM1/data/chunks.dat differ diff --git a/world/DIM1/data/raids_end.dat b/world/DIM1/data/raids_end.dat new file mode 100644 index 0000000..82c8463 Binary files /dev/null and b/world/DIM1/data/raids_end.dat differ diff --git a/world/advancements/4572e510-ac24-44b0-a915-5ed21da4028c.json b/world/advancements/4572e510-ac24-44b0-a915-5ed21da4028c.json new file mode 100644 index 0000000..5e01b24 --- /dev/null +++ b/world/advancements/4572e510-ac24-44b0-a915-5ed21da4028c.json @@ -0,0 +1,15 @@ +{ + "minecraft:recipes/decorations/crafting_table": { + "criteria": { + "unlock_right_away": "2025-10-10 17:26:39 +0200" + }, + "done": true + }, + "minecraft:adventure/adventuring_time": { + "criteria": { + "minecraft:plains": "2025-10-10 17:26:40 +0200" + }, + "done": false + }, + "DataVersion": 4325 +} \ No newline at end of file diff --git a/world/data/chunks.dat b/world/data/chunks.dat new file mode 100644 index 0000000..4089fbc Binary files /dev/null and b/world/data/chunks.dat differ diff --git a/world/data/raids.dat b/world/data/raids.dat new file mode 100644 index 0000000..82c8463 Binary files /dev/null and b/world/data/raids.dat differ diff --git a/world/data/random_sequences.dat b/world/data/random_sequences.dat new file mode 100644 index 0000000..ce54a5f Binary files /dev/null and b/world/data/random_sequences.dat differ diff --git a/world/data/scoreboard.dat b/world/data/scoreboard.dat new file mode 100644 index 0000000..4089fbc Binary files /dev/null and b/world/data/scoreboard.dat differ diff --git a/world/entities/r.-1.-1.mca b/world/entities/r.-1.-1.mca new file mode 100644 index 0000000..37abe1d Binary files /dev/null and b/world/entities/r.-1.-1.mca differ diff --git a/world/entities/r.-1.0.mca b/world/entities/r.-1.0.mca new file mode 100644 index 0000000..1363904 Binary files /dev/null and b/world/entities/r.-1.0.mca differ diff --git a/world/entities/r.0.-1.mca b/world/entities/r.0.-1.mca new file mode 100644 index 0000000..8cbb021 Binary files /dev/null and b/world/entities/r.0.-1.mca differ diff --git a/world/entities/r.0.0.mca b/world/entities/r.0.0.mca new file mode 100644 index 0000000..e69de29 diff --git a/world/icon.png b/world/icon.png new file mode 100644 index 0000000..bdd5dd7 Binary files /dev/null and b/world/icon.png differ diff --git a/world/level.dat b/world/level.dat new file mode 100644 index 0000000..8741cba Binary files /dev/null and b/world/level.dat differ diff --git a/world/level.dat_old b/world/level.dat_old new file mode 100644 index 0000000..4a8682f Binary files /dev/null and b/world/level.dat_old differ diff --git a/world/playerdata/4572e510-ac24-44b0-a915-5ed21da4028c.dat b/world/playerdata/4572e510-ac24-44b0-a915-5ed21da4028c.dat new file mode 100644 index 0000000..33d1392 Binary files /dev/null and b/world/playerdata/4572e510-ac24-44b0-a915-5ed21da4028c.dat differ diff --git a/world/playerdata/4572e510-ac24-44b0-a915-5ed21da4028c.dat_old b/world/playerdata/4572e510-ac24-44b0-a915-5ed21da4028c.dat_old new file mode 100644 index 0000000..e84bee2 Binary files /dev/null and b/world/playerdata/4572e510-ac24-44b0-a915-5ed21da4028c.dat_old differ diff --git a/world/poi/r.-1.-1.mca b/world/poi/r.-1.-1.mca new file mode 100644 index 0000000..e69de29 diff --git a/world/poi/r.-1.0.mca b/world/poi/r.-1.0.mca new file mode 100644 index 0000000..e69de29 diff --git a/world/poi/r.0.-1.mca b/world/poi/r.0.-1.mca new file mode 100644 index 0000000..e69de29 diff --git a/world/poi/r.0.0.mca b/world/poi/r.0.0.mca new file mode 100644 index 0000000..e69de29 diff --git a/world/region/r.-1.-1.mca b/world/region/r.-1.-1.mca new file mode 100644 index 0000000..fe56428 Binary files /dev/null and b/world/region/r.-1.-1.mca differ diff --git a/world/region/r.-1.0.mca b/world/region/r.-1.0.mca new file mode 100644 index 0000000..4e8b5ac Binary files /dev/null and b/world/region/r.-1.0.mca differ diff --git a/world/region/r.0.-1.mca b/world/region/r.0.-1.mca new file mode 100644 index 0000000..1c4760a Binary files /dev/null and b/world/region/r.0.-1.mca differ diff --git a/world/region/r.0.0.mca b/world/region/r.0.0.mca new file mode 100644 index 0000000..3b35084 Binary files /dev/null and b/world/region/r.0.0.mca differ diff --git a/world/session.lock b/world/session.lock new file mode 100644 index 0000000..0d7e5f8 --- /dev/null +++ b/world/session.lock @@ -0,0 +1 @@ +β˜ƒ \ No newline at end of file diff --git a/world/stats/4572e510-ac24-44b0-a915-5ed21da4028c.json b/world/stats/4572e510-ac24-44b0-a915-5ed21da4028c.json new file mode 100644 index 0000000..758ac4b --- /dev/null +++ b/world/stats/4572e510-ac24-44b0-a915-5ed21da4028c.json @@ -0,0 +1 @@ +{"stats":{"minecraft:custom":{"minecraft:time_since_rest":45,"minecraft:total_world_time":53,"minecraft:leave_game":1,"minecraft:play_time":45,"minecraft:time_since_death":45}},"DataVersion":4325} \ No newline at end of file